XSLT mendapatkan elemen terakhir

145

Saya mencoba menemukan elemen terakhir di xml saya, yang terlihat seperti:

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

Saya perlu mendapatkan semacam menu terbalik, di mana elemen saat ini dan orang tua disorot sebagai "aktif" dan saudara kandung sebagai "tidak aktif". Sebagai gantinya, saya memiliki pohon yang berantakan hanya ketika saya mengira elemen "D" diklik.

Elemen D ganda adalah masalah saya. Ketika saya menggunakan select="//element[@name='D'][last()]"atau select="//element[@name='D' and last()]"(btw mana yang benar?) Pertama kali kejadian pertama dari elemen D dipilih (debugger menunjukkan itu). Ini 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
sumber

Jawaban:

303

Anda perlu menempatkan last()pengindeksan pada hasil nodelist, bukan sebagai bagian dari kriteria pemilihan. Mencoba:

(//element[@name='D'])[last()]
Robert Christie
sumber
1
Bagaimana kita bisa menemukan node sebelum yang terakhir?
Ege
5
TIL: Rupanya tidak ada [first ()] tetapi Anda dapat menggunakan [1]
Jessica
9
Lucu bahwa saya masih mendapatkan suara untuk pertanyaan ini setelah 7 tahun. Ini benar-benar menunjukkan betapa cacat dan cacatnya XSLT. Hindari XSLT sebagai wabah: D
Nik
4
XSLT itu indah ... jika Anda tinggal di dunia XML
nicojs
// element [@ name = 'D'] [last ()] lebih idiomatis
FigmentEngine