2009-09-22 10 views
95

Je suis en train de trouver le dernier élément de mon xml, qui ressemble àXSLT obtenir dernier élément

<list> 
     <element name="A" /> 
     <element name="B" > 
      <element name="C" /> 
      <element name="D" > 
       <element name="D" /> 
       <element name="E" /> 
       <element name="F" /> 
       <element name="G" /> 
      </element> 
     <element name="H" /> 
     <element name="I" /> 
    </list> 

je dois obtenir une sorte de menus inverse, dans lequel l'élément en cours et les parents sont mis en évidence comme « active » et le frère comme "inactif". Au lieu de cela dans le résultat, j'ai un arbre en désordre seulement quand je suppose que l'élément "D" a cliqué.

Les éléments en double D sont mon problème. Lorsque j'utilise select="//element[@name='D'][last()]" ou select="//element[@name='D' and last()]" (btw lequel est correct?) Première fois première occurrence de élément D est sélectionné (débogueur montre que). Voici xsl

<xsl:template match="list"> 
    <xsl:apply-templates select="//navelement[@name = 'D'][last()]" mode="active"/> 
</xsl:template> 

<xsl:template match="element"> 
    <ul class="menu"> 
    <xsl:apply-templates select="preceding-sibling::node()" mode="inactive"/> 
     <li><a>....</a></li> 
    <xsl:apply-templates select="following-sibling::node()" mode="inactive"/> 
    </ul> 
    <xsl:apply-templates select="parent::element" mode="active"/> 
</xsl:template> 

<xsl:template match="element" mode="inactive"> 
     <li><a>....</a></li> 
</xsl:template> 

Répondre

196

Vous devez mettre la dernière() l'indexation sur le résultat nodelist, plutôt que dans le cadre des critères de sélection. Essayez

(//element[@name='D'])[last()] 
+4

+1. Joli, j'avais oublié que vous pouviez utiliser() de cette façon (et était loin de l'utilisation d'un indexeur). – AnthonyWJones

+1

Comment pouvons-nous trouver le nœud avant le dernier? – Ege

+6

@Ege '[last() - 1]' travaillé pour moi – Jessica

Questions connexes