【问题标题】:how to loop through the xml using xsl如何使用 xsl 遍历 xml
【发布时间】:2015-06-17 07:50:20
【问题描述】:

我有一个xml和xsl,如下图我想显示xml中的所有值

输入 XML

    <?xml version="1.0" encoding="UTF-8"?>
    <catalog>
        <cd>
          <test>
            <title>Empire Burlesque</title>
            <artist>Bob Dylan</artist>
          </test>
          <test1>
            <country>USA</country>
            <company>Columbia</company>
            <price>10.90</price>
            <year>1985</year>
          </test1>
        </cd>
        <cd>
            <test>
            <title>Hide your heart</title>
            <artist>Bonnie Tyler</artist>
            </test>
            <test1>
            <country>UK</country>
            <company>CBS Records</company>
            <price>9.90</price>
            <year>1988</year>
            </test1>
        </cd>
    </catalog>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th style="text-align:left">Title</th>
        <th style="text-align:left">Artist</th>
         <!--<th style="text-align:left">country</th>
        <th style="text-align:left">company</th>-->
      </tr>
      <xsl:for-each select="catalog/cd/test">
      <tr>
        <td><xsl:value-of select="//title"/></td>
        <td><xsl:value-of select="//artist"/></td>
        <!--<td><xsl:value-of select="//country"/></td>
        <td><xsl:value-of select="//company"/></td>-->
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

我想显示所有 cd 循环的标题、艺术家、国家和公司值。通过上面的代码,我只能显示第一个值。任何人都可以帮助我如何遍历 xml 并显示所有值。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    最好这样“循环”cd

    <xsl:template match="/">
      <html>
      <body>
      <h2>My CD Collection</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th style="text-align:left">Title</th>
            <th style="text-align:left">Artist</th>
             <th style="text-align:left">country</th>
            <th style="text-align:left">company</th>
          </tr>
          <xsl:for-each select="catalog/cd">
          <tr>
            <td><xsl:value-of select="test/title"/></td>
            <td><xsl:value-of select="test/artist"/></td>
            <td><xsl:value-of select="test1/country"/></td>
            <td><xsl:value-of select="test1/company"/></td>
          </tr>
          </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>
    

    这是结果:

    <html>
       <body>
          <h2>My CD Collection</h2>
          <table border="1">
             <tr bgcolor="#9acd32">
                <th style="text-align:left">Title</th>
                <th style="text-align:left">Artist</th>
                <th style="text-align:left">country</th>
                <th style="text-align:left">company</th>
             </tr>
             <tr>
                <td>Empire Burlesque</td>
                <td>Bob Dylan</td>
                <td>USA</td>
                <td>Columbia</td>
             </tr>
             <tr>
                <td>Hide your heart</td>
                <td>Bonnie Tyler</td>
                <td>UK</td>
                <td>CBS Records</td>
             </tr>
          </table>
       </body>
    </html>
    

    【讨论】:

      【解决方案2】:

      问题在于您使用xsl:value-of

      <td><xsl:value-of select="//title"/></td>
      <td><xsl:value-of select="//artist"/></td>
      

      当您使用正斜杠/ 开始表达式时,这表示文档节点,因此表达式将相对于该节点,而不是您当前所在的节点。使用// 则意味着它将在您的 XML 文档中搜索任何级别的节点,而不管您在哪个节点上。

      只需将您的表达式更改为此,以便它们与您所在的 test 节点相关

      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
      

      【讨论】:

        【解决方案3】:

        首先,您在问题中输入的 xml 示例需要进行修复。因为第一个 cd 节点上的 test1 标签没有结束标签。

        “cd”标签内的子标签名称不会一直被测试。它因人而异。它不是一直在“测试”。因此,您使用的循环控件需要修改为在 /catalog/cd 上循环,如下所示,循环内的 select 语句应适用于任何子项,如下所示。

        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        
        <xsl:template match="/">
        <html>
          <body>
          <h2>My CD Collection</h2>
          <table border="1">
            <tr bgcolor="#9acd32">
            <th style="text-align:left">Title</th>
            <th style="text-align:left">Artist</th>
             <!--<th style="text-align:left">country</th>
            <th style="text-align:left">company</th>-->
          </tr>
          <xsl:for-each select="catalog/cd">
          <tr>
            <td><xsl:value-of select="child::*/title"/></td>
            <td><xsl:value-of select="child::*/artist"/></td>
            <!--<td><xsl:value-of select="//country"/></td>
            <td><xsl:value-of select="//company"/></td>-->
          </tr>
          </xsl:for-each>
        </table>
        </body>
        </html>
        </xsl:template>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-10
          • 1970-01-01
          相关资源
          最近更新 更多