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>

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.