¿Cómo crear un valor booleano?

86

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é?

sydlawrence
fuente
3
Es sólo una sugerencia, pero es posible que obtenga una respuesta de mejor calibre si escribe el título como una pregunta adecuada y evita que se pronuncie.
Will Dean

Respuestas:

168

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 de false(), que es el constructor del booleanvalorfalse()

Los dos valores booleanos en XPath son (¡tenga en cuenta que están construidos!):

   true() y false()

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()"/>

Dimitre Novatchev
fuente
@DimitreNovatchev Hola Dimitre. Esta es la solución si el valor booleano está codificado en el archivo de transformación XSL. ¿Hay una buena solución para los falsey truelas cadenas procedentes del archivo de estar bajo la transformación que no implique la comparación de cuerdas?
Jagger
1
@Jagger, esto es para otra pregunta. Esta pregunta pregunta " Cómo crear un valor booleano " y tiene una respuesta precisa. Usted está preguntando: " Cómo interpretar (o analizar) cadenas particulares en valores booleanos "; esta es una pregunta completamente diferente. ¿Puedo preguntar qué hay de malo en la comparación de cadenas?
Dimitre Novatchev
17

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:

  • Si el argumento es un número positivo o negativo, se convierte al valor booleano verdadero.
  • Si el argumento es cero o un valor NaN, se convierte en falso.
  • Si el argumento es un conjunto de nodos no vacío, se convierte en verdadero. Un conjunto de nodos vacío se convierte en falso.
  • Si el argumento es una cadena no vacía, se convierte en verdadero . Una cadena vacía se convierte en falsa.
  • Si el argumento es un objeto de un tipo diferente a los cuatro tipos básicos, se convierte a un booleano de una manera que depende de ese tipo.
Yuval Adam
fuente
Debe reformatear el penúltimo elemento de su lista para destacar más, ya que es el crucial. "boolean ('')" también produciría false.
Tomalak
2
@Tomalak, mira mi respuesta. Es un poco más detallado y cita la verdadera fuente: W3C XPath Spec, en lugar de "MSDN".
Dimitre Novatchev
1
@Dimitre: No creo que MSDN se desvíe demasiado de la especificación W3C en este sentido. :) Pero señalar allí, por supuesto, es más correcto.
Tomalak
5

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

outofcoolnames
fuente