我有一个像这样的xml:
<movies>
<!-- 1 -->
<movie>
<movieID>0108052</movieID>
<title>Schindler's List</title>
<director>Steven Spielberg</director>
<year>1993</year>
<genre>Biography, </genre>
<genre>Drama, </genre>
<genre>History</genre>
<link>http://www.imdb.com/title/tt0108052/</link>
</movie>
<!-- 2 -->
<movie>
<movieID>0914798</movieID>
<title>The Boy in the Striped Pajamas</title>
<director>Mark Herman</director>
<year>2008</year>
<genre>Biography, </genre>
<genre>Drama, </genre>
<genre>History</genre>
<link>http://www.imdb.com/title/tt0914798/</link>
</movie>
</movies>
现在它应该读取并输出如下:(不同的电影以显示多样性)
<tr bgcolor="#3D9999">
<td><a href="http://www.imdb.com/title/tt0091369/" target="_blank">Labyrinth</a>
</td>
<td>Jim Henson</td>
<td>1986</td>
<td>Adventure, Family, Fantasy</td>
<td>0091369</td>
</tr>
但相反,我得到了这个:
<td>Adventure, </td>
MY xslt看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes" />
<xsl:template match="/">
<html>
<!-- Background image -->
<body background="bgimage.jpg">
<h2 style="color:#47B2B2">My Movie Collection</h2>
<h3 style="color:#47B2B2">Movies After 2005:</h3>
<!-- set border, color, and padding Movies after 2005-->
<table border="1" bgcolor="#0A1A1A" cellpadding="5">
<tr bgcolor="#1F4C4C">
<!-- Set order -->
<th>Title</th>
<th>Director</th>
<th>Year</th>
<th>Genre</th>
<th>ID</th>
</tr>
<xsl:for-each select="movies/movie">
<!-- Sort by title -->
<xsl:sort select="title" />
<xsl:if test="year>=2005">
<tr bgcolor="#3D9999">
<td>
<!-- Look for link, target to blank, the link text is the tittle pulled from xml -->
<a href="{link}" target="_blank">
<xsl:value-of select="title" />
</a>
</td>
<td>
<xsl:value-of select="director" />
</td>
<td>
<xsl:value-of select="year" />
</td>
<td>
<xsl:value-of select="genre" />
</td>
<td>
<xsl:value-of select="movieID" />
</td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
第47行处理它应该如何读取它,但它不起作用它只读取第一个。
答案 0 :(得分:2)
这正是xsl:value-of
在这种情况下的作用。快速解决方案是换出
<xsl:value-of select="genre"/>
的
<xsl:apply-templates select="genre"/>
假设您没有能够处理“类型”的模板。元素,这将使用XSLT的内置模板并输出文本。如果失败,你可以随时回头
<xsl:for-each select="genre">
<xsl:value-of select="."/>
</xsl:for-each>
顺便提一下,虽然它可能会使您的解决方案变得更容易,但在数据中包含分隔逗号是非常糟糕的XML设计。例如,如果您必须同时检测两种类型的电影,那么查询哪些电影具有特定类型就更加困难。和&#39;流派,&#39;。如果源数据被更改为不包含逗号,则可以执行以下操作:
<xsl:for-each select="genre">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
但是,如果您曾升级到XSLT 2.0,则可以执行此操作:
<xsl:value-of select="genre" separator=", "/>
将使用给定的分隔符输出所有类型元素。