我对XSLT的可行解决方案非常深入,我正在创建一个基于条目数组的新XML结构。
我的源XML如下所示,突出显示粗体的批处理数组。
<root>
<Header>
<Source>Company</Source>
<Target>CQ</Target>
<FileType>SalesOrder</FileType>
</Header>
<Body>
<Item>
<ItemType>RES</ItemType>
<PrimaryKey>OrderNumber</PrimaryKey>
<OrderNumber>OrderNumber</OrderNumber>
<CompanyCode>ZA01</CompanyCode>
<Company>Company</Company>
<FromWarehouseCode>WarehouseCode</FromWarehouseCode>
<DeliveryDate>2022-04-29T00:00:00</DeliveryDate>
<NumberOfLines>4</NumberOfLines>
<Additional1>4039361000004</Additional1>
<Module>Outbound</Module>
<ItemLine>
<ForeignKey>3523108912</ForeignKey>
<BatchArray>
<LineNumber>900001</LineNumber>
<ProductCode>F00000065</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>C5AH066</Batch>
<Quantity>15</Quantity>
<ExpiryDate>2023-07-31</ExpiryDate>
<Weight>85.080</Weight>
<Additional5 />
</BatchArray>
</ItemLine>
<ItemLine>
<ForeignKey>3523108912</ForeignKey>
<BatchArray>
<LineNumber>900002</LineNumber>
<ProductCode>F00000065</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>C5AK296</Batch>
<Quantity>5</Quantity>
<ExpiryDate>2023-09-30</ExpiryDate>
<Weight>28.360</Weight>
<Additional5 />
</BatchArray>
</ItemLine>
<ItemLine>
<ForeignKey>3523108912</ForeignKey>
<BatchArray>
<LineNumber>000020</LineNumber>
<ProductCode>5088821</ProductCode>
<SKUCode>PCE</SKUCode>
**<Batch>O2C-02_01</Batch>
<Batch>O2C-02_02</Batch>
<Batch>O2C-02_03</Batch>**
<Quantity>1</Quantity>
<ExpiryDate>2099-12-31</ExpiryDate>
<Weight>399.000</Weight>
<Additional5>O2C-02_01</Additional5>
<Additional5>O2C-02_02</Additional5>
<Additional5>O2C-02_03</Additional5>
</BatchArray>
</ItemLine>
</Item>
</Body>
</root>我的XSLT模板如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://exampleincludednamespace.com/"
exclude-result-prefixes="ns">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:template match="/">
<root>
<xsl:copy-of select='root/Header'/>
<Body>
<xsl:copy-of select="root/Body/Item" />
<xsl:for-each select='root/Body/Item/ItemLine/BatchArray/Batch'>
<ItemLine>
<BatchArray>
<ForeignKey>
<xsl:value-of select='../../ForeignKey' />
</ForeignKey>
<LineNumber>
<xsl:value-of select='../LineNumber' />
</LineNumber>
<ProductCode>
<xsl:value-of select='../ProductCode' />
</ProductCode>
<SKUCode>
<xsl:value-of select='../SKUCode' />
</SKUCode>
<Batch>
<xsl:value-of select='.' />
</Batch>
<Quantity>
<xsl:value-of select='../Quantity' />
</Quantity>
<ExpiryDate>
<xsl:value-of select='../ExpiryDate' />
</ExpiryDate>
<Weight>
<xsl:value-of select='../Weight' />
</Weight>
<Additional5>
<xsl:value-of select='../Batch[BatchArray/Additional5 = BatchArray/Batch]' />
</Additional5>
</BatchArray>
</ItemLine>
</xsl:for-each>
</Body>
</root>
</xsl:template>
</xsl:stylesheet>我想要它做的是用来自Additional5数组的值填充additional5标记,该值等于批处理数组的当前位置。
这个当前返回的是正确的嵌套,但是我的additional5不正确或者是空的。
<root>
<Header>
<Source>Company</Source>
<Target>CQ</Target>
<FileType>SalesOrder</FileType>
</Header>
<Body>
<Item>
<ItemType>RES</ItemType>
<PrimaryKey>OrderNumber</PrimaryKey>
<OrderNumber>OrderNumber</OrderNumber>
<CompanyCode>ZA01</CompanyCode>
<Company>Company</Company>
<FromWarehouseCode>WarehouseCode</FromWarehouseCode>
<DeliveryDate>2022-04-29T00:00:00</DeliveryDate>
<NumberOfLines>4</NumberOfLines>
<Additional1>4039361000004</Additional1>
<Module>Outbound</Module>
<ItemLine>
<ForeignKey>3523108912</ForeignKey>
<BatchArray>
<LineNumber>900001</LineNumber>
<ProductCode>F00000065</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>C5AH066</Batch>
<Quantity>15</Quantity>
<ExpiryDate>2023-07-31</ExpiryDate>
<Weight>85.080</Weight>
<Additional5 />
</BatchArray>
</ItemLine>
<ItemLine>
<ForeignKey>3523108912</ForeignKey>
<BatchArray>
<LineNumber>900002</LineNumber>
<ProductCode>F00000065</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>C5AK296</Batch>
<Quantity>5</Quantity>
<ExpiryDate>2023-09-30</ExpiryDate>
<Weight>28.360</Weight>
<Additional5 />
</BatchArray>
</ItemLine>
<ItemLine>
<ForeignKey>3523108912</ForeignKey>
<BatchArray>
<LineNumber>000020</LineNumber>
<ProductCode>5088821</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>O2C-02_01</Batch>
<Batch>O2C-02_02</Batch>
<Batch>O2C-02_03</Batch>
<Quantity>1</Quantity>
<ExpiryDate>2099-12-31</ExpiryDate>
<Weight>399.000</Weight>
<Additional5>O2C-02_01</Additional5>
<Additional5>O2C-02_02</Additional5>
<Additional5>O2C-02_03</Additional5>
</BatchArray>
</ItemLine>
</Item>
<ItemLine>
<BatchArray>
<ForeignKey>3523108912</ForeignKey>
<LineNumber>900001</LineNumber>
<ProductCode>F00000065</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>C5AH066</Batch>
<Quantity>15</Quantity>
<ExpiryDate>2023-07-31</ExpiryDate>
<Weight>85.080</Weight>
<Additional5></Additional5>
</BatchArray>
</ItemLine>
<ItemLine>
<BatchArray>
<ForeignKey>3523108912</ForeignKey>
<LineNumber>900002</LineNumber>
<ProductCode>F00000065</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>C5AK296</Batch>
<Quantity>5</Quantity>
<ExpiryDate>2023-09-30</ExpiryDate>
<Weight>28.360</Weight>
<Additional5></Additional5>
</BatchArray>
</ItemLine>
<ItemLine>
<BatchArray>
<ForeignKey>3523108912</ForeignKey>
<LineNumber>000020</LineNumber>
<ProductCode>5088821</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>O2C-02_01</Batch>
<Quantity>1</Quantity>
<ExpiryDate>2099-12-31</ExpiryDate>
<Weight>399.000</Weight>
<Additional5></Additional5>
</BatchArray>
</ItemLine>
<ItemLine>
<BatchArray>
<ForeignKey>3523108912</ForeignKey>
<LineNumber>000020</LineNumber>
<ProductCode>5088821</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>O2C-02_02</Batch>
<Quantity>1</Quantity>
<ExpiryDate>2099-12-31</ExpiryDate>
<Weight>399.000</Weight>
<Additional5></Additional5>
</BatchArray>
</ItemLine>
<ItemLine>
<BatchArray>
<ForeignKey>3523108912</ForeignKey>
<LineNumber>000020</LineNumber>
<ProductCode>5088821</ProductCode>
<SKUCode>PCE</SKUCode>
<Batch>O2C-02_03</Batch>
<Quantity>1</Quantity>
<ExpiryDate>2099-12-31</ExpiryDate>
<Weight>399.000</Weight>
<Additional5></Additional5>
</BatchArray>
</ItemLine>
</Body>
</root>我哪里出问题了?
发布于 2022-05-12 18:03:46
考虑以下最小化示例:
XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/root">
<root>
<!-- omitted -->
<Body>
<!-- omitted -->
<xsl:for-each select="Body/Item/ItemLine/BatchArray">
<xsl:for-each select="Batch">
<xsl:variable name="i" select="position()" />
<ItemLine>
<BatchArray>
<!-- omitted -->
<Batch>
<xsl:value-of select='.' />
</Batch>
<!-- omitted -->
<Additional5>
<xsl:value-of select='../Additional5[$i]' />
</Additional5>
</BatchArray>
</ItemLine>
</xsl:for-each>
</xsl:for-each>
</Body>
</root>
</xsl:template>
</xsl:stylesheet>应用于您的输入示例,这将产生:
结果
<?xml version="1.0" encoding="utf-8"?>
<root>
<Body>
<ItemLine>
<BatchArray>
<Batch>C5AH066</Batch>
<Additional5/>
</BatchArray>
</ItemLine>
<ItemLine>
<BatchArray>
<Batch>C5AK296</Batch>
<Additional5/>
</BatchArray>
</ItemLine>
<ItemLine>
<BatchArray>
<Batch>O2C-02_01</Batch>
<Additional5>O2C-02_01</Additional5>
</BatchArray>
</ItemLine>
<ItemLine>
<BatchArray>
<Batch>O2C-02_02</Batch>
<Additional5>O2C-02_02</Additional5>
</BatchArray>
</ItemLine>
<ItemLine>
<BatchArray>
<Batch>O2C-02_03</Batch>
<Additional5>O2C-02_03</Additional5>
</BatchArray>
</ItemLine>
</Body>
</root>https://stackoverflow.com/questions/72219943
复制相似问题