3

当我获取在同一个父元素中多次使用的元素的值时,我想获取同名的每个元素,而不仅仅是第一个。

例如 -

<catalog>
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
            <artist>Bob Dylan2</artist>
            <artist>Bob Dylan3</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
</cd>
</catalog>

现在,当我遍历每张 CD 并使用 value-of 输出艺术家姓名时,我只得到第一个元素(有点可以理解)。但是如何在 for-each 循环中获取所有同名元素?我尝试做一个内部 for-each 循环,但没有奏效。

我对 XML 及其工作方式非常陌生,所以请放轻松... :-(

4

6 回答 6

9
<xsl:template match="/">
    <xsl:for-each select="catalog">
        <!-- Print Other Stuff, if required -->
        <xsl:for-each select="cd/artist">
            <xsl:value-of select="text()"/><br/>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

输出:

鲍勃·迪伦
鲍勃·迪伦 2 鲍勃·迪伦
3

于 2011-12-04T16:26:26.600 回答
4

现在,当我for-each通过每张 CD 并使用value-of输出艺术家姓名时,我只得到第一个元素(有点可以理解)。但是如何在for-each 循环中获取所有同名元素?我尝试做一个内部for-each循环,但没有奏效。

我对任何XSLT 新手的建议是不要使用- 尽可能多。我知道只有一个用例是必要的,这是一种很少遇到的情况(当需要显式更改当前文档以便函数使用为该特定文档构建的索引时)。<xsl:for-each><xsl:for-each>key()

这可能是最简单的解决方案之一(<xsl:for-each>没有嵌套和没有嵌套):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="artist">
  <xsl:value-of select="concat(., '&#xA;')"/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时

<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <artist>Bob Dylan2</artist>
        <artist>Bob Dylan3</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
</catalog>

产生了想要的正确结果

Bob Dylan
Bob Dylan2
Bob Dylan3
于 2011-12-05T00:59:28.183 回答
3
<xsl:template match="catalog/cd/artist">
    <xsl:value-of select="." />
</xsl:template>
于 2011-12-04T16:38:54.517 回答
1

内部循环没有理由不起作用。您使用什么 XSLT 语法来执行此操作?听起来您的 xpath 或其他内容中有错误,因为您所描述的应该可以正常工作。

于 2011-12-04T16:24:42.147 回答
0

xpath 语法选择当前指定节点的text()任何文本子节点。

有些人不是特别喜欢这个网站,但开始时,为您指明正确的方向还不错 -点击这里

于 2011-12-04T21:21:00.770 回答
0

您的 XPATH 可能是错误的:

在使用 foreach 的 CD 元素中:

  <xsl:template match="/">
    <xsl:for-each select="//cd">
      <xsl:for-each select="artist">
        <xsl:message terminate="no">
          <xsl:value-of select="."/>
        </xsl:message>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

打印所有艺术家..

于 2011-12-04T16:27:54.240 回答