2009-06-20 14 views

Respuesta

68

El nodo actual es el 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 contextual 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 uno 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í).

Dado que un punto le da el nodo de contexto, en una expresión XPath anidada, el usuario necesita una forma de volver al nodo actual, el que está siendo procesado por la plantilla actual. Puede hacerlo a través de la función current().

Distinguir estos dos es útil en algunos casos. Por ejemplo, suponga que tiene un poco de XML como esto:

<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 supongamos que desea convertirlo en LaTeX como esto:

foo\footnote{Batteries not included.} 
bar 

baz 
aak\footnote{Some assembly required.} 

eep 
blech\footnotemark[2] 

El truco es el saber si un pie de página ya ha sido utilizado o no. 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. Se podría usar el código XSL como esto:

<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 de contexto-nodo fn (a partir de los resultados de la preceding::* conjunto de nodos) a la corriente de nodo fn atributo. (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.

+1

¿Cómo se relaciona esto con el eje propio? – Devela

Cuestiones relacionadas