1

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?

1
  • The description is somewhat confusing: do you want to go by the same position, or by the same value? I assumed it is the former (if it's the latter, whty not simply copy the value). Commented May 12, 2022 at 18:09

1 Answer 1

1

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>
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you this worked out perfectly! I was reading on various other queries and they mentioned the use of a variable but couldn't think of how to apply it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.