复制除重复节点之外的xml文档

时间:2015-10-19 09:50:01

标签: xml xslt

我只是不知道XSL中的复制是如何工作的...我有一个带有一些重复节点的文档,我想将它们排除在外。

我的文档如下:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <cd id="ab" lang="en" version="1">
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd  id="ab" lang="en" version="1">
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
    <cd  id="cd" lang="en" version="1">
        <title>Greatest Hits</title>
        <artist>Dolly Parton</artist>
        <country>USA</country>
        <company>RCA</company>
        <price>9.90</price>
        <year>1982</year>
    </cd>
    <cd  id="cd" lang="en" version="1">
        <title>Still got the blues</title>
        <artist>Gary Moore</artist>
        <country>UK</country>
        <company>Virgin records</company>
        <price>10.20</price>
        <year>1990</year>
    </cd>
    <cd  id="de" lang="en" version="2">
        <title>Eros</title>
        <artist>Eros Ramazzotti</artist>
        <country>EU</country>
        <company>BMG</company>
        <price>9.90</price>
        <year>1997</year>
    </cd>
</catalog>

所以它有一堆具有相同id,version和lang的元素。我想要做的就是复制整个文档,但每个节点只有一次......

我该怎么做?备份?复制?换各个群组?组合?

我想要这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <cd  id="ab" lang="en" version="1">
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
    <cd  id="cd" lang="en" version="1">
        <title>Still got the blues</title>
        <artist>Gary Moore</artist>
        <country>UK</country>
        <company>Virgin records</company>
        <price>10.20</price>
        <year>1990</year>
    </cd>
    <cd  id="de" lang="en" version="2">
        <title>Eros</title>
        <artist>Eros Ramazzotti</artist>
        <country>EU</country>
        <company>BMG</company>
        <price>9.90</price>
        <year>1997</year>
    </cd>
</catalog>

1 个答案:

答案 0 :(得分:1)

这是一个简单的分组问题,这是一个使用for-each-group和复合密钥的XSLT 3.0解决方案(需要Saxon 9.6 PE或EE):

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">

<xsl:output indent="yes"/>

<xsl:template match="catalog">
    <xsl:copy>
        <xsl:for-each-group select="cd" group-by="@id, @lang, @version" composite="yes">
            <xsl:copy-of select="current-group()[last()]"/>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:transform>

使用XSLT 2.0,您可以计算单个键,其中包含三个属性值的串联,由属性值中未出现的某个分隔符分隔。