XSLT ottiene l'ultimo elemento


138

Sto cercando di trovare l'ultimo elemento nel mio XML, che assomiglia a:

    <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 menu inverso, in cui l'elemento corrente e i genitori sono evidenziati come "attivi" e fratelli come "inattivi". Invece nel risultato ho un albero disordinato solo quando suppongo che l'elemento "D" abbia fatto clic.

Gli elementi a doppia D sono il mio problema. Quando uso select="//element[@name='D'][last()]"o select="//element[@name='D' and last()]"(tra cui è corretto?) La prima volta che si seleziona la prima occorrenza dell'elemento D (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>

Risposte:


290

È necessario inserire l' last()indicizzazione sul risultato della lista dei nodi, piuttosto che come parte dei criteri di selezione. Provare:

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

6
+1. Bello, avevo dimenticato che potevi usare () in quel modo (ed era decisamente fuori dall'uso di un indicizzatore).
AnthonyWJones,

1
Come possiamo trovare il nodo prima dell'ultimo?
Ege,

5
TIL: Apparentemente non c'è [first ()] ma puoi usare [1]
Jessica

8
È divertente che dopo 7 anni ricevo ancora voti per questa domanda. Mostra davvero quanto sia XSLT difettoso e difettoso. Evita XSLT come piaga: D
Nik

3
XSLT è bellissimo ... se vivi in ​​un mondo XML
nicojs il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.