3

我是 XSLT 的新手,在从简单的 XML 文件中删除重复项时遇到问题。花了很多时间试图得到它,但它永远不会完全正确。这是源文件:

<?xml version="1.0" encoding="UTF-16"?>
<language>
    <lang name="welcome">welcom</lang>
    <lang name="open">Open</lang>
    <lang name="close">Close</lang>
    <lang name="welcome">Welcome</lang>
    <lang name="copy">Copy</lang>
</language>

所需的输出是这样的:

<?xml version="1.0" encoding="UTF-16"?>
<language>
    <lang name="open">Open</lang>
    <lang name="close">Close</lang>
    <lang name="welcome">Welcome</lang>
    <lang name="copy">Copy</lang>
</language>

实际文件比这个大得多,“lang”和“name”可能会在文件的后面发生变化,我只想保留最后一个副本。基本上,如果标签和属性重复,只保留最后一个条目。我希望 XSLT 1.0 可以做到这一点。如果没有,我总是可以使用多个脚本,以防 lang 确实更改为其他内容。先感谢您!

4

2 回答 2

5

以下 XSLT 应该回答您的问题:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="lang[@name=following-sibling::lang/@name]"/>
</xsl:stylesheet>

这样,您可以过滤每个具有相同属性值的lang同级元素的元素。langname

于 2012-10-23T10:08:30.750 回答
1

比当前接受的答案的二次时间复杂度 (O(N^2)) 更通用和更有效(线性)的解决方案。这在处理大型 XML 文档时尤其重要,因为 OP 告诉我们实际文档是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kLangByName" match="lang" use="@name"/>

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

 <xsl:template match=
 "lang[not(generate-id()
      =
       generate-id(key('kLangByName', @name)[last()]))]"/>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<language>
    <lang name="welcome">welcom</lang>
    <lang name="open">Open</lang>
    <lang name="close">Close</lang>
    <lang name="welcome">Welcome</lang>
    <lang name="copy">Copy</lang>
</language>

产生了想要的正确结果

<language>
   <lang name="open">Open</lang>
   <lang name="close">Close</lang>
   <lang name="welcome">Welcome</lang>
   <lang name="copy">Copy</lang>
</language>

说明

使用Muenchian 分组方法

于 2012-10-23T12:44:16.507 回答