通过XSL(XSLT 1.0)删除XML的重复值

时间:2015-01-28 09:28:13

标签: xml xslt xslt-1.0

我想基于重复节点创建一个字符串,我需要跳过重复的值。

输入文件:

<items>
<item>
    <code>
        <str>MN</str>
    </code>
</item>
<item>
    <code>
        <str>PT</str>
    </code>
</item>
<item>
    <code>
        <str>MN</str>
    </code>
</item>
<item>
    <code>
        <str>TS</str>
    </code>
</item>
<item>
    <code>
        <str>MP</str>
    </code>
</item>
<item>
    <code>
        <str>MN</str>
    </code>
</item>
 <item>
    <code>
        <str>TS</str>
    </code>
</item>
</items>

必需输出:

<items>MN#PT#TS#MP</items>

在这里,我需要删除重复的值。

1 个答案:

答案 0 :(得分:1)

使用密钥按代码字符串查找item个元素。这是well-known method,也用作分组技术。

您的输入XML格式不正确,因为items元素未正确关闭。

XSLT样式表

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:key name="item-by-code-str" match="item" use="code/str"/>

    <xsl:template match="items">
        <xsl:copy>
            <xsl:for-each select="item[generate-id() =
                                  generate-id(key('item-by-code-str', code/str)[1])]">
              <xsl:value-of select="code/str"/>
              <xsl:if test="position() != last()">
                <xsl:text>#</xsl:text>
              </xsl:if>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XML输出

<?xml version="1.0" encoding="UTF-8"?>
<items>MN#PT#TS#MP</items>