具有多个相同键值的输入 XML:
<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 Tracker00CA1</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>001</ns3:key>
<ns3:value>GRS Tracker00CA2</ns3:value>
</ns3:item>
</ns2:enumCollection>
需要有关此转换的帮助。我正在尝试使用 xsl:Key 功能,但无法成功转换。
首先要注意的是,输入 XML 具有命名空间前缀,但没有它们的声明,这是不允许的。我假设您的实际 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>001</ns3:key>
<ns3:value>GRS Tracker00CA2</ns3:value>
</ns3:item>
</ns2:enumCollection>
要获得唯一值,您可以使用一种称为Muenchian分组的技术,因为它最初涉及获取唯一值,但在您的情况下,您将丢弃"组"的其余部分。
如果您按key
对items
进行分组,那么您的 XML 实际上应该如下所示
<xsl:key name="element-key" match="ns3:item" use="ns3:key" />
然后,要获取"非重复"值,您将执行此操作以获取每个key
第一次出现的item
试试这个 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="ns3:key" />
<xsl:template match="ns2:enumCollection">
<xsl:copy>
<xsl:apply-templates select="ns3:item[generate-id() = generate-id(key('element-key', ns3:key)[1])]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
或者,您可以使用一个模板来"丢弃"每个组中不是第一个的元素
<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="ns3:key" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns3:item[generate-id() != generate-id(key('element-key', ns3:key)[1])]" />
</xsl:stylesheet>
这两者都输出以下内容
<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>001</ns3:key>
<ns3:value>GRS Tracker00CA2</ns3:value>
</ns3:item>
</ns2:enumCollection>