忽略具有重复数据的节点

时间:2017-09-07 01:35:26

标签: xslt

在下面的xml中,我想忽略第三个节点<Data1>12347</Data1>,因为我必须只考虑第一个唯一出现的refCode。由于refCode的第一个节点值和第三个节点值是112233,我想忽略第三个节点。

<?xml version="1.0" encoding="UTF-8"?>
<Example>
    <Row>
        <Data1>12345</Data1>
        <Data2>
            <DataRef>
                <RefName>refCode</RefName>
                <RefValue>112233</RefValue>
            </DataRef>
            <DataRef>
                <RefName>SKU</RefName>
                <RefValue>444-1112</RefValue>
            </DataRef>
        </Data2>
    </Row>
    <Row>
        <Data1>12346</Data1>
        <Data2>
            <DataRef>
                <RefName>refCode</RefName>
                <RefValue>325325</RefValue>
            </DataRef>          
            <DataRef>
                <RefName>SKU</RefName>
                <RefValue>444-1113</RefValue>
            </DataRef>
        </Data2>            
    </Row>
    <Row>
        <Data1>12347</Data1>
        <Data2>
            <DataRef>
                <RefName>refCode</RefName>
                <RefValue>112233</RefValue>
            </DataRef>          
            <DataRef>
                <RefName>SKU</RefName>
                <RefValue>444-1114</RefValue>
            </DataRef>
        </Data2>            
    </Row>  
</Example>

1 个答案:

答案 0 :(得分:0)

对于XSLT-1.0,使用具有不同值原则的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="distinct" match="Row" use="Data2/DataRef/RefValue" />

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

  <!-- matches unique Row elements -->
  <xsl:template match="Row[generate-id(key('distinct',Data2/DataRef/RefValue)) = generate-id()]">
    <xsl:copy-of select="."/>
  </xsl:template>

  <!-- ignores doublettes -->
  <xsl:template match="Row" />      

</xsl:stylesheet>