使用XSLT的XML到XML删除重复项

时间:2017-02-28 11:51:35

标签: xslt

下面是输入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>

2 个答案:

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