Daniel Schotter
Daniel Schotter

Reputation: 11

XSLT Template to Retrieve from Array when Value = to Array Item

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

Answers (1)

michael.hor257k
michael.hor257k

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

Related Questions