2012-01-12 14 views
8

Dadavariable en xsl: template coincidencia de patrones

Una hoja de estilo XSLT con una variable global:

<xsl:variable name="lang" select="/response/str[@name='lang']"/> 

Pregunta

De dónde viene la limitación de que el uso de variables en los predicados es incorrecto en el patrón coincidente xsl:template, pero es aceptable en xsl:apply-templates ¿patrón de selección?

<!-- throws compilation error, at least in libxslt --> 
<xsl:template match="list[@name='item_list'][$lang]"/> 

<!-- works as expected --> 
<xsl:template match="list[@name='item_list'][/response/str[@name='lang']]"/> 

<!-- works as expected --> 
<xsl:template match="response"> 
    <xsl:apply-templates select="list[@name='item_list'][$lang]"> 
</xsl:template> 
+0

No estoy seguro de que sea la limitación, pero ¿está seguro de que su '$ lang' contiene un valor de cadena (o numérico) pero no algún conjunto de nodos? – YuS

+0

@yuri, contiene un conjunto de nodos, pero no veo una razón por la cual un conjunto de nodos no esté permitido en el contexto. – newtover

+1

No puedo decirle detalles de por qué se especificó la restricción en XSLT 1.0, pero puedo decirle que ya no está en XSLT 2.0, por lo que es posible que desee considerar pasar a esa versión del lenguaje y una de sus implementaciones como Saxon 9 o AltovaXML. –

Respuesta

10

Variables no se les permite ser usado en expresiones de coincidencia en XSLT 1.0.

partir de la especificación XSLT 1.0: Defining Template Rules

Es un error para el valor del atributo partido para contener un VariableReference.

Se permiten variables en las expresiones de coincidencia en XSLT 2.0.

partir de la especificación XSLT 2.0: Syntax of Patterns

patrones pueden comenzar con un id FO o llamada a la función clave, siempre que el valor a ser igualado se suministra ya sea como un literal o una referencia a una variable o parámetro, y el nombre de la tecla (en el caso de la función de clave ) se suministra como una cadena literal. Estos patrones nunca coinciden con con un nodo en un árbol cuya raíz no es un nodo de documento.

+0

¡Gracias! Justo antes de preguntar, miré exactamente esa sección de la especificación, pero de alguna manera pasé por alto la oración que citó. ¡Necesito dormir mejor! – newtover

+1

@newtover: P.S. también preguntó por qué una referencia de variable "es aceptable en xsl: apply-templates que selecciona el patrón". La respuesta es que la selección en 'xsl: apply-templates' no es un patrón sino una expresión XPath. Los patrones se parecen mucho a las expresiones XPath, pero no son lo mismo. Esta limitación de referencia variable es una diferencia (en XSLT 1.0). – LarsH

+0

Mads, no creo que su afirmación sobre cuándo se permiten variables en las expresiones de coincidencia sea bastante precisa, según mi lectura de la especificación. Creo que puede decir "Las variables están permitidas en las expresiones de coincidencia en XSLT 2.0", incluso si se refieren a un nodo de documento.Es solo que los patrones que contienen llamadas a funciones key() e id() nunca coincidirán con un nodo en un árbol cuya raíz no es un nodo de documento ... pero eso no limita el valor de una variable en el patrón. – LarsH

Cuestiones relacionadas