我有一个电影xml文件的结构
<movies>
<movie>
<genre>Drama</genre>
<genre>Thriller</genre>
</movie>
....
</movies>
不应该为每个电影标签选择每个类型值的片段有效吗?
<xsl:template match="/">
<html>
<body>
<h2>MOVIES</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Genre</th>
</tr>
<xsl:for-each select="movies/movie">
<tr>
<td>
<xsl:for-each select="movies/movie/genre">
<xsl:value-of select="genre"/>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
它没有显示任何输出。任何人都可以指出错误吗?
答案 0 :(得分:2)
由于嵌套xsl:for-each
中的选择器,它无法正常工作:外部版本遍历movies/movie
,因此在内部版本中,您已经在movie
元素中,但是您重新选择movies/movie/genre
;这意味着你正在寻找/movies/movie/movies/movie/genre
。 xsl:value-of
也使用了错误的选择器。
代码应该是(未经测试的):
<xsl:for-each select="movies/movie">
<tr>
<td>
<!-- context element here is movie -->
<xsl:for-each select="genre">
<!-- context element here is genre -->
<xsl:value-of select="."/>
<!-- Separate genres with a comma -->
<xsl:if test="not(position() = last())">, </xsl:if>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
顺便说一句(偏离主题),{4}中已弃用bgcolor
属性(很久以前):)
您应该使用style
代替:
<tr style="background-color: #9acd32;">
答案 1 :(得分:2)
虽然sierrasdetandil的回答已经为您提供了解决问题的方法,但我想使用apply-templates
代替for-each
提供替代方案:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
<html>
<body>
<h2>MOVIES</h2>
<table>
<tr><th>Genre</th></tr>
<xsl:apply-templates />
</table>
</body>
</html>
</xsl:template>
<xsl:template match="movies">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="movie">
<tr>
<td>
<xsl:apply-templates />
</td>
</tr>
</xsl:template>
<xsl:template match="genre">
<xsl:value-of select="." />
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:1)
就这么简单:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<table><xsl:apply-templates/></table>
</xsl:template>
<xsl:template match="movie">
<tr>
<xsl:apply-templates select="node()|@*"/>
</tr>
</xsl:template>
<xsl:template match="genre"><td><xsl:apply-templates/></td></xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<movies>
<movie>
<genre>Drama</genre>
<genre>Thriller</genre>
</movie>
</movies>
产生了想要的正确结果:
<table>
<tr>
<td>Drama</td>
<td>Thriller</td>
</tr>
</table>