XSLT 1.0分别在节点级获取唯一值

时间:2017-03-03 13:04:15

标签: xml xslt xslt-1.0

我们试图使用XSLT 1.0分别为每个节点获取唯一值。例如,

<root>
<node name="1234">
    <node name="9876">
        <child ln="2" name="CA1">
            <CA01>10</CA01>
        </child>
    </node>
    <node name="9876">
        <child ln="2" name="CA1">
            <CA01>9</CA01>
        </child>
    </node>
    <node name="9876">
        <child ln="2" name="CA1">
            <CA01>10</CA01>
        </child>
    </node>
</node>
<node name="1234">
    <node name="9876">
        <child ln="2" name="CA1">
            <CA01>10</CA01>
        </child>
    </node>
    <node name="9876">
        <child ln="2" name="CA1">
            <CA01>5</CA01>
        </child>
    </node>
</node>

代码

    <!-- Template called for each node 1234 -->
<xsl:for-each select="node[@name='9876']/child[@name='CA1']/CA01/text()     [generate-id()
                                   = generate-id(key('CA01Code',.)[1])]">
  <xsl:value-of select="."/>

预期输出

对于第一节点1234 =&gt; 10,9

对于第二节点1234 =&gt; 10,5

但是,为每个1234节点调用时的实际输出会给出不同的输出

实际输出

对于第一节点1234 =&gt; 10,9

对于第二节点1234 =&gt;的 5

编辑带有密钥定义的XSLT

关键定义

<xsl:key name="CA01Code" match="node[@name='9876']/child[@name='CA1']/CA01/text()" use="." />

模板定义

<xsl:template match="node[@name='1234']">
<xsl:for-each select="node[@name='9876']/child[@name='CA1']/CA01/text()[generate-id() = generate-id(key('CA01Code',.)[1])]">
    <xsl:value-of select="."/>
</xsl:for-each>  </xsl:template>

1 个答案:

答案 0 :(得分:0)

更改

<xsl:key name="CA01Code" match="node[@name='9876']/child[@name='CA1']/CA01/text()" use="." />

<xsl:key name="CA01Code" match="node[@name='9876']/child[@name='CA1']/CA01" use="concat(generate-id(ancestor::node[last()]), '|', .)"/>

然后将模板转到

<xsl:template match="node[@name='1234']">
<xsl:for-each select="node[@name='9876']/child[@name='CA1']/CA01[generate-id() = generate-id(key('CA01Code',concat(generate-id(ancestor::node[last()]), '|', .))[1])]">
    <xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>