juls_pro_37
juls_pro_37

Reputation: 79

xslt 1.0 duplicate check on each line

i´ve a little problem in my xml. if there are more articles (Lines) under LineItem, it should be possible that the same texts are at article 1 and article 2. (the duplicate check just should be on each line - not at LineItem) the check for duplicates on line should be just check, if there are duplicates on line not on the LineItem. hope you can help me?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>

  <xsl:key name="header_text" match="HeaderText" use="Text"/>
  <xsl:key name="line_text" match="LineText" use="Text"/>

  <!-- Identity-Template für die nicht explizit benannten Elemente -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="HeaderText[generate-id() != generate-id(key('header_text', Text)[1])]" />
  <xsl:template match="LineText[generate-id() != generate-id(key('line_text', Text)[1])]" />

<!-- delete empty nodes -->
 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
 <xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>

</xsl:stylesheet>

like this:

...<LineItem>
        <Lines>
          <OrderLineNum>1</OrderLineNum>          
          <GTIN></GTIN>
          <GTINDescription></GTINDescription>
          <SupplierArticleNumber></SupplierArticleNumber>          
          <Quantity>3</Quantity>
          <PriceUnit>1</PriceUnit>
          <FixedPrice>0</FixedPrice>
          <SalesPrice>10</SalesPrice>          
          <DiscAmount>0</DiscAmount>
          <DiscPercent>0</DiscPercent>
          <SalesLinePercent1>0</SalesLinePercent1>
          <SalesLinePercent2>0</SalesLinePercent2>
          <MultiLnDisc>0</MultiLnDisc>
          <MultiLnPercent>0</MultiLnPercent>
          <LineAmount>0</LineAmount>
          <SumLineDisc>0</SumLineDisc>
          <DeliveredQuantity></DeliveredQuantity>
          <VatBaseAmount>0</VatBaseAmount>
          <VatPercentage></VatPercentage>
          <Measure_Unit></Measure_Unit>
          <LineText>
            <Qualifier>LIN</Qualifier>
            <Text>test</Text>
          </LineText>
          <LineText>
            <Qualifier>DEL</Qualifier>
            <Text>test 2</Text>
          </LineText>          
        </Lines>
        <Lines>
          <OrderLineNum>2</OrderLineNum>          
          <GTIN></GTIN>
          <GTINDescription></GTINDescription>
          <SupplierArticleNumber></SupplierArticleNumber>          
          <Quantity>3</Quantity>
          <PriceUnit>1</PriceUnit>
          <FixedPrice>0</FixedPrice>
          <SalesPrice></SalesPrice>          
          <DiscAmount>0</DiscAmount>
          <DiscPercent>0</DiscPercent>
          <SalesLinePercent1>0</SalesLinePercent1>
          <SalesLinePercent2>0</SalesLinePercent2>
          <MultiLnDisc>0</MultiLnDisc>
          <MultiLnPercent>0</MultiLnPercent>
          <LineAmount></LineAmount>
          <SumLineDisc>0</SumLineDisc>
          <DeliveredQuantity></DeliveredQuantity>
          <VatBaseAmount></VatBaseAmount>
          <VatPercentage></VatPercentage>
          <Measure_Unit></Measure_Unit>
		  <LineText>
            <Qualifier>LIN</Qualifier>
            <Text>test</Text>
          </LineText>
          <LineText>
            <Qualifier>DEL</Qualifier>
            <Text>test 2</Text>
          </LineText>
        </Lines>
      </LineItem>
      <Totals>...

wrong at line 1:

...<LineItem>
        <Lines>
          <OrderLineNum>1</OrderLineNum>          
          <GTIN></GTIN>
          <GTINDescription></GTINDescription>
          <SupplierArticleNumber></SupplierArticleNumber>          
          <Quantity>3</Quantity>
          <PriceUnit>1</PriceUnit>
          <FixedPrice>0</FixedPrice>
          <SalesPrice>10</SalesPrice>          
          <DiscAmount>0</DiscAmount>
          <DiscPercent>0</DiscPercent>
          <SalesLinePercent1>0</SalesLinePercent1>
          <SalesLinePercent2>0</SalesLinePercent2>
          <MultiLnDisc>0</MultiLnDisc>
          <MultiLnPercent>0</MultiLnPercent>
          <LineAmount>0</LineAmount>
          <SumLineDisc>0</SumLineDisc>
          <DeliveredQuantity></DeliveredQuantity>
          <VatBaseAmount>0</VatBaseAmount>
          <VatPercentage></VatPercentage>
          <Measure_Unit></Measure_Unit>
          <LineText>
            <Qualifier>LIN</Qualifier>
            <Text>test</Text>
          </LineText>
          <LineText>
            <Qualifier>DEL</Qualifier>
            <Text>test 2</Text>
          </LineText>
		  <LineText>
            <Qualifier>LIN</Qualifier>
            <Text>test</Text>
          </LineText>
          <LineText>
            <Qualifier>DEL</Qualifier>
            <Text>test 2</Text>
          </LineText>             
        </Lines>
        <Lines>
          <OrderLineNum>2</OrderLineNum>          
          <GTIN></GTIN>
          <GTINDescription></GTINDescription>
          <SupplierArticleNumber></SupplierArticleNumber>          
          <Quantity>3</Quantity>
          <PriceUnit>1</PriceUnit>
          <FixedPrice>0</FixedPrice>
          <SalesPrice></SalesPrice>          
          <DiscAmount>0</DiscAmount>
          <DiscPercent>0</DiscPercent>
          <SalesLinePercent1>0</SalesLinePercent1>
          <SalesLinePercent2>0</SalesLinePercent2>
          <MultiLnDisc>0</MultiLnDisc>
          <MultiLnPercent>0</MultiLnPercent>
          <LineAmount></LineAmount>
          <SumLineDisc>0</SumLineDisc>
          <DeliveredQuantity></DeliveredQuantity>
          <VatBaseAmount></VatBaseAmount>
          <VatPercentage></VatPercentage>
          <Measure_Unit></Measure_Unit>
		  <LineText>
            <Qualifier>LIN</Qualifier>
            <Text>test</Text>
          </LineText>
          <LineText>
            <Qualifier>DEL</Qualifier>
            <Text>test 2</Text>
          </LineText>
        </Lines>
      </LineItem>
      <Totals>...

Upvotes: 2

Views: 114

Answers (1)

Tim C
Tim C

Reputation: 70618

I think you need the OrderLineNum from the Lines in your key along with Text

<xsl:key name="line_text" match="LineText" use="concat(../OrderLineNum, '|', Text)"/>

Then the match becomes this...

<xsl:template match="LineText[generate-id() != generate-id(key('line_text', concat(../OrderLineNum, '|', Text))[1])]" />

Try this XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
  <xsl:strip-space elements="*" />
  <xsl:key name="header_text" match="HeaderText" use="Text"/>
  <xsl:key name="line_text" match="LineText" use="concat(../OrderLineNum, '|', Text)"/>

  <!-- Identity-Template für die nicht explizit benannten Elemente -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="HeaderText[generate-id() != generate-id(key('header_text', Text)[1])]" />
  <xsl:template match="LineText[generate-id() != generate-id(key('line_text', concat(../OrderLineNum, '|', Text))[1])]" />

<!-- delete empty nodes -->
 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>

Upvotes: 1

Related Questions