XSLT erhält das letzte Element

138

Ich versuche, das letzte Element in meiner XML zu finden, das wie folgt aussieht:

    <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 brauche eine Art umgekehrtes Menü, in dem das aktuelle Element und die Eltern als "aktiv" und die Geschwister als "inaktiv" hervorgehoben werden. Stattdessen habe ich im Ergebnis nur dann einen unordentlichen Baum, wenn ich annehme, dass auf das Element "D" geklickt wurde.

Double D-Elemente sind mein Problem. Wenn ich select="//element[@name='D'][last()]"oder select="//element[@name='D' and last()]"(übrigens welches ist richtig?) Zum ersten Mal das erste Auftreten des D-Elements auswähle (Debugger zeigt das). 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>
Nik
quelle

Antworten:

290

Sie müssen die last()Indizierung auf das Ergebnis der Knotenliste setzen und nicht als Teil der Auswahlkriterien. Versuchen:

(//element[@name='D'])[last()]
Robert Christie
quelle
6
+1. Schön, ich hatte vergessen, dass Sie () auf diese Weise verwenden können (und war weit davon entfernt, einen Indexer zu verwenden).
AnthonyWJones
1
Wie können wir den Knoten vor dem letzten finden?
Ege
5
TIL: Anscheinend gibt es kein [first ()], aber Sie können [1] verwenden
Jessica
8
Es ist lustig, dass ich nach 7 Jahren immer noch Stimmen für diese Frage bekomme. Es zeigt wirklich, wie fehlerhaft und fehlerhaft XSLT ist. Vermeiden Sie XSLT als Pest: D
Nik
2
XSLT ist wunderschön ... wenn Sie in einer XML-Welt leben
nicojs