考虑以下xml:
<Images>
<Extra1>a</Extra1>
<Extra2>b</Extra2>
<Img1>img1</Img1>
<Img2>img2</Img2>
<Img3>img2</Img3>
<Img4>img1</Img4>
</Images>
我想要元素Img1, Img2, Img3, Img4
的不同值的集合,以便输出节点集具有值img1
和img2
。我以前使用过xsl:key
,但这需要所有元素的名称都相同。如何为不同的元素名称实现这一点?
您可以这样做:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="kImageValue" match="Images/*[starts-with(local-name(), 'Img')]"
use="."/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Images">
<xsl:copy>
<xsl:apply-templates select="*[generate-id() = generate-id(key('kImageValue', .)[1])]" />
</xsl:copy>
</xsl:template>
<xsl:template match="Images/*">
<Value>
<xsl:value-of select="."/>
</Value>
</xsl:template>
</xsl:stylesheet>
当在样本输入上运行时,结果是:
<Images>
<Value>img1</Value>
<Value>img2</Value>
</Images>