web-dev-qa-db-fra.com

XSLT récupère le dernier élément

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>

Je dois obtenir une sorte de menu inversé, où l'élément actuel et les parents sont mis en surbrillance comme "actifs" et la fratrie comme "inactifs". Au lieu de cela, j'ai un arbre en désordre uniquement lorsque je suppose que l'élément "D" est cliqué.

Les doubles éléments sont mon problème. Lorsque j'utilise select="//element[@name='D'][last()]" ou select="//element[@name='D' and last()]" (en fait, lequel est correct?) Pour la première fois première occurrence de L'élément D est sélectionné (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>
123
Nik

Vous devez mettre l'indexation last() sur le résultat de la liste de noeuds, plutôt que dans les critères de sélection. Essayer

(//element[@name='D'])[last()]
263
Robert Christie