xml - tutorial - Nodo actual vs. nodo Contexto en XSLT/XPath?
xpath tutorial español (1)
El nodo actual es lo que sea que la plantilla esté funcionando actualmente. Normalmente, este también es el nodo de contexto, pero el nodo de contexto tiene un significado especial dentro de una expresión XPath anidada (la parte entre corchetes). Allí, se refiere a cualquier nodo que se esté probando actualmente para una coincidencia. Por lo tanto, el nodo de contexto cambia dentro de la expresión XPath, pero no el nodo actual.
El nodo de contexto se puede abreviar con un punto ( .
) O a veces puede omitirse por completo. Esto es probablemente un poco confuso, porque fuera de una expresión anidada, un punto significa el nodo actual. (En ese caso, el nodo actual pasa a ser el nodo de contexto, por lo que se podría decir que es el nodo actual solo de forma aproximada, y se llama más apropiadamente nodo de contexto. Pero incluso la especificación lo llama nodo actual aquí).
Como un punto le proporciona el nodo de contexto, en una expresión XPath anidada, el usuario necesita una forma de volver al nodo actual, el que está procesando la plantilla actual. Puede hacerlo a través de la función current()
.
Distinguir estos dos es útil en algunos casos. Por ejemplo, supongamos que tienes un XML como este:
<a>
<b>
<c>foo<footnote fn="1"/></c>
<d>bar</d>
</b>
<b>
<c>baz</c>
<d>aak<footnote fn="2"/></d>
</b>
<b>
<c>eep</c>
<d>blech<footnote fn="2"/></d>
</b>
<footnote-message fn="1">Batteries not included.</footnote>
<footnote-message fn="2">Some assembly required.</footnote>
</a>
Ahora suponga que quiere convertirlo a LaTeX de esta manera:
foo/footnote{Batteries not included.}
bar
baz
aak/footnote{Some assembly required.}
eep
blech/footnotemark[2]
El truco es saber si ya se ha utilizado o no una nota al pie. Si esta es la primera vez que te encuentras con la nota al pie, quieres escribir un comando /footnote
; de lo contrario, desea escribir un comando /footnotemark
. Puede usar un código XSL como este:
<xsl:choose>
<xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">/footnote{...}</xsl:when>
<xsl:otherwise>/footnotemark[...]</xsl:otherwise>
</xsl:choose>
Aquí estamos comparando el atributo fn
nodo de contexto (de los resultados del conjunto de nodos preceding::*
) con el atributo fn
nodo actual. (En realidad no tiene que decir ./@fn
; podría simplemente decir @fn
).
En resumen, el nodo contextual lo deja dentro del predicado XPath; el nodo actual llega fuera del predicado, de vuelta al nodo que procesa la plantilla actual.
En XSLT, ¿cuál es la diferencia entre el "nodo actual" y el "nodo de contexto"? Puede encontrar ambos términos utilizados aquí: http://www.w3.org/TR/xslt .
¿Cuándo usarías uno o el otro? ¿Cómo te refieres a cada uno?