2009-09-22 1 views
95

Sto cercando di trovare l'ultimo elemento nel mio xml, che si presenta comeXSLT ottenere ultimo elemento

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

ho bisogno di ottenere una sorta di menù inversa, in cui elemento e genitori corrente vengono evidenziati come "attiva" e fratello come "inattivo". Invece nel risultato ho un albero disordinato solo quando suppongo che l'elemento "D" sia cliccato.

Gli elementi a doppia D sono il mio problema. Quando utilizzo select="//element[@name='D'][last()]" o select="//element[@name='D' and last()]" (btw quale è corretto?) Prima volta prima occorrenza di elemento D selezionato (il debugger lo mostra). Ecco 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> 

risposta

196

Hai bisogno di mettere l'ultimo) di indicizzazione (sul risultato NodeList, piuttosto che come parte dei criteri di selezione. Prova

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

+1. Bello, mi ero dimenticato che si poteva usare() in quel modo (ed era molto diverso dall'uso di un indicizzatore). – AnthonyWJones

+1

Come possiamo trovare il nodo prima dell'ultimo? – Ege

+6

@Ege '[last() - 1]' ha funzionato per me – Jessica