xml - xslt 1.0 每行重复检查
问题描述
我的 xml 有一个小问题。如果 LineItem 下有更多文章(行),则第 1 条和第 2 条应该有相同的文本。(重复检查应该在每一行 - 而不是 LineItem)在线重复检查应该是只需检查,是否有重复的行不在 LineItem 上。希望你能帮我?
<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>
像这样:
...<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>...
第 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>...
解决方案
我认为你需要OrderLineNum
从Lines
你的钥匙中Text
<xsl:key name="line_text" match="LineText" use="concat(../OrderLineNum, '|', Text)"/>
那么比赛就变成了这样……
<xsl:template match="LineText[generate-id() != generate-id(key('line_text', concat(../OrderLineNum, '|', Text))[1])]" />
试试这个 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>
推荐阅读
- sql - 将 SAS SQL 转换为 Hive SQL
- android - 微调器选择的项目与工具栏标题的样式相同
- javascript - 清除 sessionStorage 不会从 iFrame 中清除会话存储。有没有办法做到这一点?
- python - AttributeError:将 .py 转换为 .exe 时,模块 'tokenize' 没有属性 'open'
- unity3d - 如何检查可以通过其云诊断服务在 Unity 中发送多少用户生成的报告?
- javascript - 使用命令 Announce 时出现错误
- python - 如何在 django 中设置布尔值
- mongodb - mongoDB更改流中是否有任何领导者概念
- amazon-web-services - 使用 AWS 和 Next JS 在 Amplify 中刷新应用程序
- c# - 根据 DataGridView 中组合框 B 中的选定值过滤组合框 A 中的值