【问题标题】:Basic XML/XSLT - value-of when there are multiple elements of the same name基本 XML/XSLT - 存在多个同名元素时的值
【发布时间】:2012-01-12 16:22:44
【问题描述】:

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

例如-

<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 及其工作原理非常陌生,所以请放轻松...:-(

【问题讨论】:

    标签: xml xslt foreach value-of


    【解决方案1】:

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

    有些人不是特别喜欢这个网站,但刚开始,给你指出正确的方向还不错 - click here

    【讨论】:

      【解决方案2】:

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

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

      这可能是最简单的解决方案之一(没有&lt;xsl:for-each&gt; 并且没有嵌套):

      <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
      

      【讨论】:

        【解决方案3】:
        <xsl:template match="catalog/cd/artist">
            <xsl:value-of select="." />
        </xsl:template>
        

        【讨论】:

          【解决方案4】:
          <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

          【讨论】:

          • 选择="。"应该优先使用 select="text()"。如果内容包含 cmets、嵌套子元素等,它会更加健壮 - 特别是如果您正在针对不连接相邻文本节点的实现运行 - 这是不符合要求的,但它会发生。
          • 这似乎奏效了——我只需要做一个内部的 for-each 和 text()。你能告诉我 text() 函数是做什么的吗?
          【解决方案5】:

          您的 XPATH 可能是错误的:

          在 CD 元素中使用 foreach 时:

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

          打印所有艺术家..

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-11-02
              • 2019-08-14
              • 1970-01-01
              • 2011-04-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多