我只是不知道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>
答案 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,您可以计算单个键,其中包含三个属性值的串联,由属性值中未出现的某个分隔符分隔。