如何选择元素,然后使用xslt中的另一个元素对它们进行排序?

时间:2014-05-11 18:23:20

标签: xml xslt

我是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 1.html

我想要做的是为每个actor创建一个html文件。它应该包含他演奏的所有电影。电影应按年份排序,然后按名称排序。换句话说,如果演员在同一年播放的2部电影中播放,则应按照电影的名称进行排序。例如,我试图为#34; actor 1.html&#34; :

actor 1.html

注意电影1,2和5应按名称按字母顺序排序。

我试图选择这些电影:&#34; $ document // name [./ actor = $ actor-value]&#34;通过元素年,然后制作一个for-each,但我似乎不知道如何。

任何人都可以请你知道如何做到这一点。谢谢!

1 个答案:

答案 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>