2009-09-22 15 views
95

Ich versuche, das letzte Element in meinem xml zu finden, die wieXSLT immer letztes Element

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

ich eine Art von Reverse-Menü sieht bekommen müssen, wo aktuelles Element und Eltern werden als „aktiv“ markiert und Geschwister als "inaktiv". Stattdessen habe ich einen unordentlichen Baum, nur wenn ich an "D" geklickt habe.

Double D Elemente sind mein Problem. Wenn ich select="//element[@name='D'][last()]" oder select="//element[@name='D' and last()]" (von welcher Seite ist richtig?) Erste Mal ersten Auftreten von D-Element ausgewählt ist (Debugger zeigt, dass). Hier ist 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> 

Antwort

196

Sie müssen die letzte() Indizierung auf dem Nodelist Ergebnis bringen, und nicht als Teil der Auswahlkriterien. Versuchen Sie

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

+1. Nice one, ich hatte vergessen, dass du() auf diese Weise benutzen könntest (und war weit weg von der Verwendung eines Indexers). – AnthonyWJones

+1

Wie können wir den Knoten vor dem letzten finden? – Ege

+6

@Ege '[last() - 1]' arbeitete für mich – Jessica