考虑XML文件:
<collection>
<director id="d1">
<name>Michael Bay</name>
</director>
<director id="d2">
<name>Quentin Tarantino</name>
</director>
<movie directors="d1">
<title>Explosions</title>
</movie>
<movie directors="d1 d2">
<title>Blood and Explosions</title>
</movie>
</collection>
我希望XSLT(XSLT 1.0)将其转换为所有导演的列表,并列出他们执导的所有电影的子列表。
应该是这样的:
<ul>
<li>Quentin Tarantino
<ul><li>Blood and Explosions</li></ul>
</li>
<li>Michael Bay
<ul>
<li>Explosions</li>
<li>Blood and Explosions</li>
</ul>
</li>
</ul>
我尝试使用for-each和if语句,但是我不知道如何比较@id和@directors。
这是我到目前为止所拥有的:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:template match="/">
<html>
<body>
<h3>Directors</h3>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="director">
<xsl:for-each select="//movie">
</xsl:for-each>
</xsl:template>
有什么建议吗?
答案 0 :(得分:1)
您要为导演选择电影的表情是这样。
<xsl:for-each select="../movie[contains(concat(' ', @directors, ' '), concat(' ', current()/@id, ' '))]">
此处使用concat是为了避免在电影中拥有d12
导演的位置,因此您要避免与其匹配的d1
(因为d12
包含{ {1}})
尝试使用此XSLT
d1
(请注意使用<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:template match="/collection">
<html>
<body>
<h3>Directors</h3>
<ul>
<xsl:apply-templates select="director" />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="director">
<li>
<xsl:value-of select="name" />
<ul>
<xsl:for-each select="../movie[contains(concat(' ', @directors, ' '), concat(' ', current()/@id, ' '))]">
<li>
<xsl:value-of select="title" />
</li>
</xsl:for-each>
</ul>
</li>
</xsl:template>
</xsl:stylesheet>
,因为否则使用<xsl:apply-templates select="director" />
将选择所有子节点,并且由于XSLT的内置模板,您最终会得到{{1}中的文本}被输出到您不想要的位置。
如果您可以使用XSLT 2.0,则可以使用<xsl:apply-templates />
来简化操作:
movie