XSLT排序元素不起作用

时间:2013-03-23 14:31:24

标签: xml sorting xslt

我正在尝试对列表中显示的所有演员名称进行排序。必须有一些我想念的简单但我无法弄清楚它是什么。

    <xsl:key name="kName" match="actor/name" use="." />

    <xsl:template match="/">
    <xsl:element name="html">
        <xsl:element name="head">
            <xsl:element name="title">
                <xsl:text>Actors list</xsl:text>
            </xsl:element>
            <xsl:element name="h2">Actors list</xsl:element>
        </xsl:element>
        <xsl:element name="body">
            <xsl:variable name="actorNames" select="/movies/movie/cast/actors/actor/name"/>
            <xsl:apply-templates select="$actorNames[generate-id() = generate-id(key('kName', .)[1])]">
                <xsl:sort select="./name"/>
            </xsl:apply-templates>
        </xsl:element>
    </xsl:element>
</xsl:template>

<xsl:template match="name">
      <xsl:element name="a">
          <xsl:attribute name="href">actor_details.php?movieID=<xsl:value-of select="../../../../@movieID"/>&amp;actorID=<xsl:value-of select="../@actorID"/></xsl:attribute>
              <xsl:value-of select="." />
      </xsl:element>
      <xsl:element name="br" />
</xsl:template>

2 个答案:

答案 0 :(得分:3)

您不需要xsl:键进行排序,您可以直接在apply-templates中应用sort

这有效:

 <xsl:key name="kName" match="actor/name" use="." />

 <xsl:template match="/">
    <xsl:element name="html">
      <xsl:element name="head">
        <xsl:element name="title">
          <xsl:text>Actors list</xsl:text>
        </xsl:element>
        <xsl:element name="h2">Actors list</xsl:element>
      </xsl:element>
      <xsl:element name="body">

        <!-- your way -->
        <xsl:variable name="actorNames" select="/movies/movie/cast/actors/actor/name"/>
        <xsl:apply-templates select="$actorNames[generate-id() = generate-id(key('kName', .)[1])]">
           <xsl:sort select="."/>
        </xsl:apply-templates>

        <!-- my way -->
        <xsl:apply-templates select="movies/movie/cast/actors/actor">
          <xsl:sort select="./name"/>
        </xsl:apply-templates>

      </xsl:element>
    </xsl:element>
  </xsl:template>

答案 1 :(得分:1)

你实际上做错了是这个。您的apply-templates正在选择名称元素。您的xsl:sort键是./name,它是相对于正在排序的节点计算的。由于名称元素没有名称子元素,因此没有选择任何内容。

但正如勒内所指出的那样,你使用钥匙也是非常不必要的。