我有一个xml和xsl,如下所示我想显示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>
<?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并显示所有值。
答案 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>