使用XSLT从XML文件中删除重复值

时间:2015-03-31 09:40:16

标签: xml xslt

我正在尝试使用XSLT从XML文件中删除重复项。 输入是这样的:

<catalog>
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
</cd>
<cd>
    <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>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
</cd>

所需的输出是:

<catalog>
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
</cd>
<cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
</cd>

基本上我正在尝试删除重复记录。 我如何完成这项工作?

1 个答案:

答案 0 :(得分:0)

假设所有cd元素具有相同顺序的相同子元素,并且条形字符|不是您可以使用的任何值的一部分

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:output indent="yes"/>

<xsl:template match="/*">
  <xsl:copy>
    <xsl:for-each-group select="cd" group-by="string-join(*, '|')">
      <xsl:copy-of select="."/>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

显然,如果该条形字符可以在任何值内,您可以使用不同的字符来分隔值。