我正在尝试对列表中显示的所有演员名称进行排序。必须有一些我想念的简单但我无法弄清楚它是什么。
<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"/>&actorID=<xsl:value-of select="../@actorID"/></xsl:attribute>
<xsl:value-of select="." />
</xsl:element>
<xsl:element name="br" />
</xsl:template>
答案 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,它是相对于正在排序的节点计算的。由于名称元素没有名称子元素,因此没有选择任何内容。
但正如勒内所指出的那样,你使用钥匙也是非常不必要的。