xml - XSLT:显示一个节点的多个实例
问题描述
我只是有一个小问题,我似乎无法弄清楚我做错了什么。我对 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
循环可能不在正确的位置有关?谢谢!
解决方案
我猜(!)你在movie
. 在这种情况下,指令:
<xsl:for-each select="movie/genre">
什么都不选择。
要处理作为genre
current 子元素的元素movie
,您必须执行以下操作:
<xsl:for-each select="genre">
添加:
在这里你又犯了同样的错误:
<xsl:for-each select="genre">
将您置于genre
. 在这种情况下,指令:
<xsl:value-of select="genre"/>
什么都不选择。genre
不是自己的孩子。你需要做:
<xsl:value-of select="."/>
(.
选择上下文节点。)
推荐阅读
- javascript - 我需要将我的 json 文件插入到 sqlite 数据库中
- linux-kernel - 当 RTC 更改时,Linux 内核驱动程序是否可以调用回调?
- javascript - React 组件在状态更改后不会重新渲染
- css - 如何在 Bootstrap4 中以 sm-md 大小创建具有固定项目位置的导航栏
- vscode-debugger - 终端进程命令“/usr/bin/bash”启动失败(退出代码:1)
- excel - 有没有办法将大单词表转换为新行上的每个单词
- list - 从 kotlin 中的字符串中查找对象的最佳方法是什么?
- reactjs - 现在是使用 React refs 的好时机吗?
- mysql - 使用 MySQL,我需要弄清楚如何获取两种数据类型(文本和日期)并以句子形式输出它们
- mysql - 选择已知日期范围内的行