我是xslt 2.0的新手。我不确定我的问题是否准确。
这是xml文件:
<movies>
<movie>
<actor>actor 1</actor>
<actor>actor 2</actor>
<actor>actor 3</actor>
<name>movie 1</name>
<year>1997</year>
</movie>
<movie>
<actor>actor 1</actor>
<actor>actor 4</actor>
<actor>actor 5</actor>
<name>movie 2</name>
<year>1997</year>
</movie>
<movie>
<actor>actor 1</actor>
<actor>actor 6</actor>
<actor>actor 7</actor>
<name>movie 3</name>
<year>1995</year>
</movie>
<mockumentary>
<actor>actor 1</actor>
<actor>actor 8</actor>
<actor>actor 9</actor>
<name>movie 4</name>
<year>2000</year>
</mockumentary>
<mockumentary>
<actor>actor 1</actor>
<actor>actor 10</actor>
<actor>actor 11</actor>
<name>movie 5</name>
<year>1997</year>
</mockumentary>
</movies>
这是我到目前为止所做的:
<xsl:template match="/">
<xsl:variable name="document" select="."/>
<xsl:for-each select="distinct-values(//actor)">
<xsl:variable name="actor-value"> <xsl:value-of select="."/> </xsl:variable>
<xsl:result-document href="{concat($file-name, '.html')}">
<html>
<body>
<!--selects all movie names where the current actor plays-->
<xsl:apply-templates select="$document//name[../actor=$actor-value]" >
<xsl:sort select="../year" order="descending" />
<xsl:sort select="../name" />
</xsl:apply-templates>
</body>
</html>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="name">
<tr><th colspan="3"><xsl:value-of select="../year"/></th></tr>
<tr>
<!-- i call here a certain template that lists all actors -->
<xsl:text> , </xsl:text>
<xsl:value-of select="../name"/>
</tr>
</xsl:template>
演员1生成的html文件看起来有点像这样:
我想要做的是为每个actor创建一个html文件。它应该包含他演奏的所有电影。电影应按年份排序,然后按名称排序。换句话说,如果演员在同一年播放的2部电影中播放,则应按照电影的名称进行排序。例如,我试图为#34; actor 1.html&#34; :
注意电影1,2和5应按名称按字母顺序排序。
我试图选择这些电影:&#34; $ document // name [./ actor = $ actor-value]&#34;通过元素年,然后制作一个for-each,但我似乎不知道如何。
任何人都可以请你知道如何做到这一点。谢谢!
答案 0 :(得分:0)
我终于在answer
的帮助下找到了它我使用for-each-group按年份分组不同的电影。
这是新代码:
<xsl:template match="/">
<xsl:variable name="document" select="."/>
<xsl:for-each select="distinct-values(//actor)">
<xsl:variable name="actor-value"> <xsl:value-of select="."/> </xsl:variable>
<xsl:result-document href="{concat($file-name, '.html')}">
<html>
<body>
<p>
<table>
<xsl:for-each-group select="$document//name[../actor=$actor-value]" group-by="../year">
<!--************** SORT BY YEAR **************-->
<xsl:sort select="../year" data-type="number" order="descending"/>
<tr><th><xsl:value-of select="../year"/></th></tr>
<xsl:apply-templates select="current-group()" >
<!--************** SORT BY TITLE **************-->
<xsl:sort select="." data-type="text" order="ascending" />
</xsl:apply-templates>
</table>
</p>
</body>
</html>
</xsl:result-document>
</xsl:for-each>
</xsl:template>