根据xslt中的唯一组合删除重复节点

时间:2014-12-12 11:29:52

标签: xml xslt

输入具有多个相同键值的XML:

                    <ns2:enumCollection xmlns:ns2="ns2" xmlns:ns3="ns3">
                        <ns3:item>
                            <ns3:key>000</ns3:key>
                            <ns3:value>GRS Tracker00CA1</ns3:value>
                        </ns3:item>
                        <ns3:item>
                            <ns3:key>000</ns3:key>
                            <ns3:value>GRS Tracker00CA1</ns3:value>
                        </ns3:item>
                        <ns3:item>
                            <ns3:key>000</ns3:key>
                            <ns3:value>GRS Tracker00CA2</ns3:value>
                        </ns3:item>
                        <ns3:item>
                            <ns3:key>001</ns3:key>
                            <ns3:value>GRS Tracker00CA2</ns3:value>
                        </ns3:item>                             
                    </ns2:enumCollection>

预期输出结果:

                    <ns2:enumCollection>
                        <ns3:item>
                            <ns3:key>000</ns3:key>
                            <ns3:value>GRS Tracker00CA1</ns3:value>
                        </ns3:item>
                        <ns3:item>
                            <ns3:key>000</ns3:key>
                            <ns3:value>GRS Tracker00CA2</ns3:value>
                        </ns3:item>
                        <ns3:item>
                            <ns3:key>001</ns3:key>
                            <ns3:value>GRS Tracker00CA2</ns3:value>
                        </ns3:item>                             
                    </ns2:enumCollection>

需要有关此转型的帮助。节点具有独特的组合并且必须保留。

1 个答案:

答案 0 :(得分:0)

您需要在此使用连锁密钥

<xsl:key name="element-key" match="ns3:item" use="concat(ns3:key, '|', ns3:value)" /> 

然后你可以得到像这样的不同元素:

<xsl:apply-templates select="ns3:item[generate-id() = generate-id(key('element-key', concat(ns3:key, '|', ns3:value))[1])]"/>

要说明的是,使用的分隔符(在这种情况下为|)不应出现在keyvalue值中。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="ns2" xmlns:ns3="ns3">
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="element-key" match="ns3:item" use="concat(ns3:key, '|', ns3:value)" /> 

    <xsl:template match="ns2:enumCollection">
       <xsl:copy>
          <xsl:apply-templates select="ns3:item[generate-id() = generate-id(key('element-key', concat(ns3:key, '|', ns3:value))[1])]"/>
        </xsl:copy>
    </xsl:template>

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