输入具有多个相同键值的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>
需要有关此转型的帮助。节点具有独特的组合并且必须保留。
答案 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])]"/>
要说明的是,使用的分隔符(在这种情况下为|
)不应出现在key
或value
值中。
试试这个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>