XSLT obtient le dernier élément

138

J'essaie de trouver le dernier élément de mon xml, qui ressemble à:

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

J'ai besoin d'obtenir une sorte de menu inversé, où l'élément actuel et les parents sont mis en évidence comme "actifs" et les frères comme "inactifs". Au lieu de cela, j'ai un arbre désordonné uniquement lorsque je suppose que l'élément "D" a cliqué.

Les éléments Double D sont mon problème. Quand j'utilise select="//element[@name='D'][last()]"ou select="//element[@name='D' and last()]"(btw lequel est correct?) La première fois que la première occurrence de l' élément D est sélectionnée (le débogueur le montre). Voici 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
la source

Réponses:

290

Vous devez placer l' last()indexation sur le résultat de la liste de nœuds, plutôt que dans le cadre des critères de sélection. Essayer:

(//element[@name='D'])[last()]
Robert Christie
la source
6
+1. Belle, j'avais oublié que vous pouviez utiliser () de cette façon (et j'étais loin de l'utilisation d'un indexeur).
AnthonyWJones
1
Comment trouver le nœud avant le dernier?
Ege
5
TIL: Apparemment, il n'y a pas de [first ()] mais vous pouvez utiliser [1]
Jessica
8
C'est drôle que j'obtienne encore des votes pour cette question après 7 ans. Cela montre vraiment à quel point le XSLT est défectueux et défectueux. Évitez XSLT comme une peste: D
Nik
3
XSLT est magnifique ... si vous vivez dans un monde XML
nicojs