Soy totalmente nuevo en XSLT y no puedo averiguar dónde me equivoco con el siguiente código.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
Siempre devuelve verdadero cuando se supone que es falso. ¿Por qué?
Respuestas:
El valor de la variable $ var como se define en:
<xsl:variable name="var" select="boolean('false')"/>
es
true()
Esto se debe a que en XPath "
false
" es una cadena ordinaria, a diferencia defalse()
, que es el constructor delboolean
valorfalse()
Los dos valores booleanos en XPath son (¡tenga en cuenta que están construidos!):
true()
yfalse()
Los detalles de la conversión de cualquier valor a booleano se detallan en la especificación XPath :
"La función booleana convierte su argumento en un booleano de la siguiente manera:
un número es verdadero si y solo si no es cero positivo o negativo ni NaN
un conjunto de nodos es verdadero si y solo si no está vacío
una cadena es verdadera si y solo si su longitud no es cero
un objeto de un tipo distinto de los cuatro tipos básicos se convierte en un booleano de una manera que depende de ese tipo "
En su caso, la cadena "falso" no es el número 0 y tiene una longitud positiva, por lo que se aplica la regla de la tercera viñeta anterior, cedendo
true()
.Por lo tanto, para definir una variable en XSLT 1.0, cuyo valor es
false()
, es necesario escribir la definición de la siguiente manera:<xsl:variable name="vMyVar" select="false()"/>
o, si no recuerda esto exactamente, siempre puede escribir:
<xsl:variable name="vMyVar" select="1 = 0"/>
(especifique cualquier expresión que evalúe
false()
) y el procesador XSLT hará el trabajo por usted.En XSLT 2.0 siempre es mejor especificar explícitamente el tipo de variable:
<xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>
fuente
false
ytrue
las cadenas procedentes del archivo de estar bajo la transformación que no implique la comparación de cuerdas?La función booleana () que está utilizando realmente está haciendo su trabajo. Para usar valores verdaderos y falsos explícitos, debe usar las siguientes funciones:
<xsl:variable name="var_false" select="false()"/> <xsl:variable name="var_true" select="true()"/>
Solo para su información, según la documentación de MSDN , boolean () devuelve lo siguiente:
fuente
Quizás un poco tarde en esta etapa, pero en mi opinión, lidiar con booleanos simplemente no vale la pena el esfuerzo. Así es como traté con un booleano (obligatorio) que regresaba de la base de datos:
<xsl:variable name="vTrue" select="true()"/> <xsl:choose> <xsl:when test="string(Mandatory) = string($vTrue)"> <xsl:text>Mandatory</xsl:text> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose>
Espero que esto ayude a alguien
fuente