使用XSLT删除简单XML文件中的重复条目

问题描述:

我是XSLT新手,并且遇到了从简单XML文件中删除重复项的问题。花了很多时间尝试去获得它,但它从来不是正确的。这里是源文件:使用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> 

实际文件比这大得多,“郎”和“名”以后可能会更改文件中的,和我只想保留最后的重复。基本上,如果标签和属性被复制,只保留最后一个条目。我希望XSLT 1.0可以做到这一点。如果没有,我总是可以使用多个脚本,以防郎改变为别的东西。先谢谢你!

+0

你在你的问题中提到属性。你可以在你的** lang **元素上有多个属性,还是只有** name **属性? –

+0

可能有更多的属性,但标签和名称属性是我唯一需要比较的属性。无论如何,其他属性(如果有的话)也将是相同的。 – CosmicDan

下面的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元素与为name属性的值相同跟随兄弟lang元素。

+0

谢谢!它完美的作品:) – CosmicDan

比当前接受的答案的二次方时间复杂度(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 grouping method

+1

嘿,谢谢你。是的,这是一个大量的数据,但不是很大,并且不需要定期运行。但我明白你的意思,所以谢谢你未来的提示:) – CosmicDan

+0

@CosmicDan,不客气。 –