Reputation: 11
I am quite far into a workable solution for XSLT where I am creating a new XML structure based on the existence of an array of items.
My source XML is as follows with the bolded Batch array highlighted.
<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>
My XSLT Template is as follows:
<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>
What I want it to do is populate the Additional5 tag with the Value from the additional5 Array where it is equal to the current position of the Batch array.
This currently returns this which is the correct nesting but my additional5 is not correct or is blank.
<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>
Where am I going wrong?
Upvotes: 1
Views: 215
Reputation: 117140
Consider the following minimized example:
XSLT 1.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>
Applied to your input example, this will produce:
Result
<?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>
Upvotes: 1