Nodo actual vs. nodo Contexto en XSLT / XPath?

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?

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:

   foo bar   baz aak   eep blech  Batteries not included. Some assembly required.  

Ahora supongamos 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:

  \footnote{...} \footnotemark[...]  

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.

Contexto del nodo

El nodo de contexto es parte del contexto de evaluación XPath y varía con cada paso de ubicación :

 step1 / step2 / step3 / ... 

donde cada step es

 axis::node-test[predicate] 
  • Cada paso se evalúa con respecto a los nodos de contexto establecidos por los pasos anteriores .
  • Cada paso selecciona nodos que se convierten en el nodo de contexto para los siguientes pasos.
  • Al evaluar el predicate , el nodo de contexto es el nodo a lo largo del axis que ha pasado node-test .
  • Se puede acceder al nodo de contexto como . .

Nodo actual

El nodo actual () es parte del modelo de procesamiento XSLT : 1

  • El nodo actual es el nodo en el documento XML de origen que mejor se corresponde con una plantilla XSLT.
  • El nodo actual se convierte en el nodo de contexto inicial para cada expresión XPath en la plantilla coincidente.
  • Se puede acceder al nodo actual como current() dentro de los predicados XPath.

1 Aunque es insignificante para comprender la diferencia básica entre el nodo de contexto y el nodo actual, tenga en cuenta que en XSLT 2.0 se ha cambiado la descripción del contexto de evaluación. Los conceptos de nodo actual y lista de nodos actual han sido reemplazados por los conceptos de XPath de elemento de contexto , posición de contexto y tamaño de contexto.