如何使用xsl循环遍历xml

时间:2015-06-17 07:50:20

标签: xml xslt

我有一个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并显示所有值。

3 个答案:

答案 0 :(得分:0)

问题在于您使用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>

答案 1 :(得分:0)

最好&#34;循环&#34; 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 :(得分:0)

首先你在问题中提出的xml样本,需要修复。因为第一个cd节点上的test1标签没有结束标记。

&#34; cd&#34;内的子标签名称标签不是一直在测试。它有所不同。它不是&#34;测试&#34;每时每刻。因此,您使用的循环控件需要修改为在/ 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>