Reputation: 79
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
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