需要忽略/删除XSLT 1.0中的重复节点

时间:2018-07-10 20:07:21

标签: xml xslt xpath

任何人都可以帮助我,需要使用XSLT 1.0省略XML标记中的重复项。

我是XSLT的新手,非常感谢您的帮助。

输入

thingFunction

预期输出:

<JdeVariable>
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
</JdeVariable>

1 个答案:

答案 0 :(得分:0)

由于您坚持使用XSLT 1.0,因此需要使用muenchian grouping来消除重复的节点。

使用以下方式定义xsl:key

<xsl:key name="key-val" match="ns0:JDE" use="ns0:JdeNumber" />

匹配模板以仅过滤唯一节点

<xsl:template match="ns0:JDE[generate-id() = generate-id(key('key-val', ns0:JdeNumber))]">
    <xsl:copy>
        <xsl:apply-templates select="node()" />
    </xsl:copy>
</xsl:template>

完整的XSLT代码如下(请参阅方法注释)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://someurl">
    <xsl:output method="xml" />
    <xsl:strip-space elements="*" />

    <xsl:key name="key-val" match="ns0:JDE" use="ns0:JdeNumber" />

    <!-- identity transform template to copy input as is to output -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="ns0:JDE[generate-id() = generate-id(key('key-val', ns0:JdeNumber))]">
        <xsl:copy>
            <xsl:apply-templates select="node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="ns0:JDE" />
</xsl:stylesheet>

输出

<JdeVariable xmlns:ns0="http://someurl">
    <ns0:JDE>
        <ns0:JdeNumber>39184</ns0:JdeNumber>
    </ns0:JDE>
    <ns0:JDE>
        <ns0:JdeNumber>39186</ns0:JdeNumber>
    </ns0:JDE>
</JdeVariable>