2010-06-03 22 views
6

¿Por quétest = "" en un valor lógico siempre devuelve verdadero

<xsl:if test="<XPATH to boolean value here>"> 
... 
</xsl:if> 

siempre devuelven verdadero?

Dado que boolean puede ser 0,1, "falso" y "verdadero" por definición, la ÚNICA forma de probar un valor booleano es hacer una comparación de cadenas con estos. Esto no puede ser correcto

+0

¿puede por favor publicar su expresión XPath actual con un fragmento XML? –

+0

Esto no es una pregunta en absoluto. Por favor, den un ejemplo específico: ¿cuál es exactamente la expresión XPath y cuál es el archivo XML (el más simple posible, por favor) en el que se evalúa esta expresión XPath? –

+0

Prefiero ver un ejemplo, supongo que hay un pequeño error en la sintaxis. –

Respuesta

8

El test especificado en <xsl:if> obras como si se llama a la función boolean. Esta función no funciona de la manera que podrías pensar. Si su argumento se evalúa como un conjunto de nodos (que será si usa una ruta como argumento), devolverá verdadero si el conjunto de nodos no está vacío y de lo contrario es falso. Entonces, efectivamente, estás probando la existencia de un elemento, no su valor. Si foo contiene false,

<xsl:if test="/path/to/foo"> 

siempre será evaluada como verdadera, ya que lo que realmente está pidiendo en esa prueba es "qué existe este elemento?" y no "¿el valor del elemento es verdadero?" Y el elemento existe.

La regla de que los valores booleanos deben estar true, false, 1 o 0 es una parte del esquema XML (which see) y no XPath, que no sabe nada acerca de esta regla. (XPath 1.0, es decir, XPath 2.0/XQuery 1.0 tiene the fn:boolean function, que hace inteligente, es decir, consciente del esquema XML, evaluación de valores booleanos). Para determinar si un valor es verdadero en XSLT, debe verificarlo explícitamente:

<xsl:if test="/path/to/foo = 'true' or /path/to/foo = '1'"> 
+0

Si estoy leyendo http://www.w3.org/TR/xpath/#section-Boolean-Functions correctamente, no debería haber diferencia entre las dos pruebas. En realidad, xsl: if se especifica para convertir el resultado de la prueba como si fuera una llamada a la función booleana. –

+0

Sabes, lo sabía. Corregido –

+0

En su ejemplo anterior, se encontrará con un problema una vez que utilice un procesador compatible con esquemas. Dado que el procesador sabe por el esquema que/ruta/a/foo es xs: booleano, producirá un mensaje de error "No se puede comparar xs: booleano a xs: cadena". Tengo exactamente este problema (con un atributo booleano), y realmente no sé cómo resolverlo. ¿Alguna ayuda? –

0

La especificación xpath proporciona una función booleana. Por lo tanto, boolean (Valor) siempre devolverá verdadero o falso.

Cuestiones relacionadas