2013-03-23 75 views
2

我想排序显示在列表中的所有演员名称。必须有一些简单的东西我失踪了,但我无法弄清楚它是什么。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> 

回答

3

你并不需要一个xsl:键排序,可以直接应用在应用模板的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> 
+0

谢谢你的回复,rene。但是,我将如何将它应用于我的特殊情况,因为我正在使用“apply-templates select =”$ actorNames [generate-id()= generate-id(key('kName',。)[1])]“” ?我已经用你的解决方案更新了我的文章,但由于某种原因,它仍然不起作用 – Alex 2013-03-23 15:01:41

+0

我还为你实施该方法的方式添加了一个选项 – rene 2013-03-23 15:09:37

+0

这很完美,谢谢你的帮助,rene! – Alex 2013-03-23 15:11:18

1

什么你实际上在做错误的是这样的。你的应用模板是选择名称元素。您的xsl:sort关键字是./name,它是相对于正在排序的节点计算的。由于名称元素没有名称子元素,因此没有选择任何元素。

但正如rene指出的那样,您使用密钥也是不必要的。

+0

谢谢澄清这,迈克尔。我使用的键来选择独特的元素值,因为我已经在我的其他问题发布。[链接](http://stackoverflow.com/questions/15455618/select-unique-element-values-based-on -the-attribute-with-xpath-1-0)。所以我不得不使用键,但我也想排序这些独特的元素值。 – Alex 2013-03-25 21:47:36