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>

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()]

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.