XSLT pobiera ostatni element

138

Próbuję znaleźć ostatni element w moim xml, który wygląda następująco:

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

Potrzebuję jakiegoś odwróconego menu, w którym aktualny element i rodzice są podświetleni jako „aktywny”, a rodzeństwo jako „nieaktywni”. Zamiast tego mam niechlujne drzewo tylko wtedy, gdy przypuszczam, że kliknięto element „D”.

Moim problemem są elementy Double D. Kiedy używam select="//element[@name='D'][last()]"or select="//element[@name='D' and last()]"(btw, który z nich jest poprawny?) Po raz pierwszy wybierane jest pierwsze wystąpienie elementu D (debugger to pokazuje). Oto 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
źródło

Odpowiedzi:

290

Musisz umieścić last()indeksowanie na liście węzłów, a nie jako część kryteriów wyboru. Próbować:

(//element[@name='D'])[last()]
Robert Christie
źródło
6
+1. Niezłe, zapomniałem, że możesz używać () w ten sposób (i nie korzystałem z indeksatora).
AnthonyWJones
1
Jak możemy znaleźć węzeł przed ostatnim?
Ege
5
TIL: Najwyraźniej nie ma [first ()], ale możesz użyć [1]
Jessica
8
To zabawne, że po 7 latach wciąż otrzymuję głosy na to pytanie. To naprawdę pokazuje, jak wadliwy i wadliwy jest XSLT. Unikaj XSLT jako plagi: D
Nik,
2
XSLT jest piękny ... jeśli żyjesz w świecie XML
nicojs