首页 > 解决方案 > 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>...

标签: xmlxsltxslt-1.0

解决方案


我认为你需要OrderLineNumLines你的钥匙中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>

推荐阅读