xslt选择不同的值元素

时间:2013-07-10 06:51:12

标签: xslt xslt-1.0

考虑以下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的不同值的集合,以便输出节点集具有值img1img2。我之前使用过xsl:key,但这需要所有元素名称相同。如何为不同的元素名称实现这一目标?

1 个答案:

答案 0 :(得分:1)

你可以这样做:

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