Además de reescribir una gran cantidad de código XSLT (que no voy a hacer), ¿hay alguna manera de encontrar la posición de un elemento dentro de su elemento primario? cuando el contexto se establece arbitrariamente en otra cosa? He aquí un ejemplo:Encuentra la posición de un elemento dentro de su elemento primario con XSLT/XPath
<!-- Here are my records-->
<xsl:for-each select="/path/to/record">
<xsl:variable name="record" select="."/>
<!-- At this point, I could use position() -->
<!-- Set the context to the current record -->
<xsl:for-each select="$record">
<!-- At this point, position() is meaningless because it's always 1 -->
<xsl:call-template name="SomeTemplate"/>
</xsl:for-each>
</xsl:for-each>
<!-- This template expects the current context being set to a record -->
<xsl:template name="SomeTemplate">
<!-- it does stuff with the record's fields -->
<xsl:value-of select="SomeRecordField"/>
<!-- How to access the record's position in /path/to or in any other path? -->
</xsl:template>
NOTA: Este es un ejemplo simplificado. Tengo varias limitaciones que me impiden implementar soluciones obvias, como pasar nuevos parámetros al SomeTemplate
, etc. Realmente solo puedo modificar las partes internas de SomeTemplate
.
NOTA: Estoy usando Xalan 2.7.1 con EXSLT. Entonces esos trucos están disponibles
¿Alguna idea?
¡Eres el hombre! Adapté tu sugerencia a '1 + count (previous-sibling :: *)' ¡y funcionó como un amuleto! –
Acerca de su actualización: en el ejemplo del mundo real, los registros son siempre uniformes (aunque no siempre se llaman 'registro') ya que modelan una tabla. Por lo tanto, no existe un operador sindical de dos conjuntos de nodos XPath "incompatibles".La solución variable no funcionaría debido a la complejidad del código del mundo real –
Gracias por los consejos adicionales sobre 'position()'. Como siempre estoy haciendo un bucle sobre elementos uniformes, en mi caso, la posición de bucle coincide con el índice del elemento dentro de su elemento primario. –