¿Cómo obtener la posición del nodo principal en el documento completo utilizando xpath?Buscar posición del nodo principal utilizando xpath
decir que tienen la siguiente xml:
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
</catalog>
y tengo un XSLT para convertirlo en HTML, que es el siguiente (sólo fragmento de código):
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<p>
<xsl:number format="1. "/><br/>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
<xsl:template match="title">
<xsl:number format="1" select="????" /><br/>
Title: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
¿Qué debo escribir en el lugar de ???? para obtener la posición de la etiqueta padre cd en el documento. He intentado muchas expresiones pero parece que nada funciona. Puede ser que lo estoy haciendo completamente mal.
<xsl:number format="1" select="catalog/cd/preceding-sibling::..[position()]" />
<xsl:number format="1" select="./parent::..[position()]" /><br/>
<xsl:value-of select="count(cd/preceding-sibling::*)+1" /><br/>
estoy interpretando como segundo eje padre de selección del nodo actual y luego digo la posición del padre del nodo actual. ¿Por qué no está funcionando? ¿Cuál es la forma correcta de hacer esto?
FYI: Espero que el código imprima la posición de la etiqueta de cd principal del procesamiento actual de la etiqueta del título uder.
Por favor, alguien me puede decir cómo hacerlo.
Gracias una tonelada hombre, ahora que era tonto de mi parte no probar eso. Gracias de nuevo :) – Harshdeep
Solo una cosa más puede explicar la expresión "count (../ previous-sibling :: cd) + 1" como lo hizo para "position()". Usé su solución y funcionó muy bien, pero no puedo entender por qué no "count (cd/previous-sibling :: ..) + 1" – Harshdeep
Recuerde que las plantillas XSLT operan desde la perspectiva del nodo de contexto actual. En la plantilla correspondiente, el nodo de contexto es el título. Por lo tanto, 'count (cd ...)' no encontrará ningún nodo porque no hay nodos secundarios de 'title' llamados' cd' (de hecho, 'title' no tiene nodos secundarios de ningún nombre). 'cd' es el padre de' title', no es su hijo, por lo tanto, tenemos que subir un nivel. – Utkanos