我只是有一个小问题,似乎无法弄清楚自己在做什么错。我是XSLT的新手,所以如果我犯了新手错误或提出类似问题,我深表歉意。我只是有一个包含电影数据的简单XML文件,并且试图显示每部电影的所有流派。有些电影有多种类型,有些只有一种。但是,当我尝试实现解决方案时,我似乎根本没有任何输出。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="movies.xsl"?>
<movies>
<movie>
<title lang="en">Spider-Man: Into the Spider-Verse</title>
<poster-url>https://resizing.flixster.com/b5taZMzly27b3UlO8PArsKvP3qM=/fit-in/200x296.2962962962963/v1.bTsxMjg3MjM1MDtqOzE3OTIzOzEyMDA7NjA3Mjs5MDAw</poster-url>
<trailer src="http://www.intothespiderverse.movie/#trailer"/>
<release-date><year>2018</year> <month>12</month> <day>14</day></release-date>
<director>Bob Persichetti</director>
<director>Peter Ramsey</director>
<director>Rodney Rotham</director>
<genre>action</genre>
<genre>animated</genre>
<genre>superhero</genre>
<runtime>100</runtime>
<actor>Shameik Moore</actor>
<actor>Hailee Steinfeld</actor>
<actor>Mahershala Ali</actor>
<mpaa>
<rating>PG</rating>
</mpaa>
<studio>Sony Pictures</studio>
<reviews>
</reviews>
</movie>
和我的XSLT代码段
<xsl:choose>
<xsl:when test="count(genre) > 1">
Genres:
<xsl:for-each select="genre">
<xsl:value-of select="genre"/>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
Genre:
<xsl:value-of select="genre"/>
</xsl:otherwise>
</xsl:choose>
这是我的整个文档。
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head>
<title>Movies Movies Movies</title>
</head>
<body>
<h1>Movies Movies Movies</h1>
<ul>
<xsl:for-each select="movies/movie">
<li><xsl:value-of select="title"/>
<br/>
<img>
<xsl:attribute name="src">
<xsl:value-of select="poster-url"/>
</xsl:attribute>
</img>
See the
<xsl:choose>
<xsl:when test="not(trailer)">
<a>
<xsl:attribute name="href">
<xsl:value-of select="translate(review,' ','+')"/>
</xsl:attribute>
<xsl:text>reviews</xsl:text>
</a>
</xsl:when>
<xsl:otherwise>
<a>
<xsl:attribute name="href">
<xsl:value-of select="translate(trailer,' ','+')"/>
</xsl:attribute>
<xsl:text>trailer</xsl:text>
</a>
and
<a>
<xsl:attribute name="href">
<xsl:value-of select="translate(review,' ','+')"/>
</xsl:attribute>
<xsl:text>reviews</xsl:text>
</a>
</xsl:otherwise>
</xsl:choose>
<br/>
<xsl:choose>
<xsl:when test="count(genre) > 1">
Genres:
<xsl:for-each select="genre">
<xsl:value-of select="genre"/>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
Genre:
<xsl:value-of select="genre"/>
</xsl:otherwise>
</xsl:choose>
<br/>
Released:
<xsl:value-of select="release-date/year"/>
<xsl:value-of select="format-number(release-date/month,'-00')"/>
<xsl:value-of select="format-number(release-date/day,'-00')"/>
</li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
在上面的代码段中,我首先确认电影是否具有一种或多种类型。如果它不止一个,我将开始一个循环并尝试显示所有与该流派相关的流派并结束循环。如果只有1个,那么它很好并且很简单,我只显示类型。它的多种流派显示似乎不起作用,只有一种显示的电影就好了。我认为这可能与我的for-each
循环有关,可能不在正确的位置吗?
谢谢!
答案 0 :(得分:1)
我猜(!)您在movie
的上下文中。在这种情况下,说明:
<xsl:for-each select="movie/genre">
不选择任何内容。
要处理当前genre
的子元素movie
,您必须执行以下操作:
<xsl:for-each select="genre">
您在这里再次犯了同样的错误:
<xsl:for-each select="genre">
将您置于genre
的上下文中。在这种情况下,说明:
<xsl:value-of select="genre"/>
不选择任何内容。 genre
本身不是孩子。您需要这样做:
<xsl:value-of select="."/>
({.
选择上下文节点。)