使用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可以做到这一点。如果没有,我总是可以使用多个脚本,以防郎改变为别的东西。先谢谢你!
下面的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
元素。
谢谢!它完美的作品:) – 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>
说明:
嘿,谢谢你。是的,这是一个大量的数据,但不是很大,并且不需要定期运行。但我明白你的意思,所以谢谢你未来的提示:) – CosmicDan
@CosmicDan,不客气。 –
你在你的问题中提到属性。你可以在你的** lang **元素上有多个属性,还是只有** name **属性? –
可能有更多的属性,但标签和名称属性是我唯一需要比较的属性。无论如何,其他属性(如果有的话)也将是相同的。 – CosmicDan