【问题标题】:Skipping duplicate values of XML by XSL (XSLT 1.0)通过 XSL (XSLT 1.0) 跳过 XML 的重复值
【发布时间】:2015-03-27 03:22:13
【问题描述】:

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

输入文件:

<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>

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

【问题讨论】:

    标签: xml xslt xslt-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>
    

    【讨论】:

    • 感谢 Mathias Müller 的快速回复。当项目数超过 2 lac 时是否存在任何性能问题。
    • @DVekaria 不,键是查找元素的一种非常有效的方法。恐怕我不知道“2 lac”是什么意思。
    • 2 lac 表示 200000。我已经检查过了,它工作正常。谢谢。
    • @DVekaria 有趣,我今天也学到了一些东西。不客气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多