xslt 1.0 дублирующая проверка на каждой строке - PullRequest
0 голосов
/ 02 ноября 2018

У меня небольшая проблема в моем 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>...

1 Ответ

0 голосов
/ 02 ноября 2018

Я думаю, вам нужно 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>
...