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过,但这要求所有元素名称都相同。我怎样才能为不同的元素名称实现这一点?

4

1 回答 1

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>
于 2013-07-10T07:12:51.460 回答