XSLT obteniendo el último elemento

138

Estoy tratando de encontrar el último elemento en mi xml, que se parece a:

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

Necesito obtener algún tipo de menú inverso, donde el elemento actual y los padres se resaltan como "activos" y los hermanos como "inactivos". En cambio, tengo un árbol desordenado solo cuando supongo que el elemento "D" hizo clic.

Los elementos de doble D son mi problema. Cuando uso select="//element[@name='D'][last()]"o select="//element[@name='D' and last()]"(por cierto, ¿cuál es el correcto?) Por primera vez se selecciona la primera aparición del elemento D (el depurador lo muestra). Aquí está 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
fuente

Respuestas:

290

Debe colocar la last()indexación en el resultado de la lista de nodos, en lugar de como parte de los criterios de selección. Tratar:

(//element[@name='D'])[last()]
Robert Christie
fuente
66
+1. Agradable, se me había olvidado que podías usar () de esa manera (y estaba muy lejos del uso de un indexador).
AnthonyWJones
1
¿Cómo podemos encontrar el nodo antes del último?
Ege
55
TIL: Aparentemente no hay [primero ()] pero puedes usar [1]
Jessica
8
Es curioso que todavía obtenga votos para esta pregunta después de 7 años. Realmente muestra cuán defectuoso y defectuoso es XSLT. Evite XSLT como una plaga: D
Nik
3
XSLT es hermoso ... si vives en un mundo XML
nicojs