下面是输入xml文件:
<assets>
<item>
<file_name>file123</file_name>
<description>testing</description>
<created>date</created>
<metadata>
<guest>name</guest>
<webinfo>test</webinfo>
<albumorder>3</albumorder>
<albumorder>3</albumorder>
</metadata>
</item>
</assets>
从上面的xml元数据/ albumorder中有重复。我想只保留一个albumorder元素。如何删除重复的元素。
结果文件应该是:
<assets>
<item>
<file_name>file123</file_name>
<description>testing</description>
<created>date</created>
<metadata>
<guest>name</guest>
<webinfo>test</webinfo>
<albumorder>3</albumorder>
</metadata>
</item>
</assets>
答案 0 :(得分:0)
以下仅复制元素,这些元素不具有相同的命名前导兄弟元素:
<?xml version="1.0" encoding="UTF-8"?>
<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:template match="*">
<xsl:if test="not(preceding-sibling::*[name(.) = name(current())])">
<xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
有一种称为“XSL身份模板”或“XSL身份转换”的模式,它将保留除您定义的规则之外的所有XML以更改某些元素。
kiwiwings已经指出了解决方案,我只是将它集成到身份模板中,否则你会丢失XML注释,属性和处理指令(它们都不存在于你的XML中,但是其他人可能拥有它们)。
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:template match="comment()|processing-instruction()|text()">
<xsl:copy/>
</xsl:template>
<xsl:template match="*">
<xsl:if test="not(preceding-sibling::*[name(.) = name(current())])">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="comment()|processing-instruction()|text()|*"/>
</xsl:copy>
</xsl:if>
</xsl:template>