2008-12-06 14 views
79

Soy totalmente nuevo en XSLT y no puedo determinar dónde me estoy equivocando con el siguiente código.¿Cómo crear un valor booleano?

<xsl:variable name="var" select="boolean('false')"/> 

<xsl:if test="$var'">variable is true</xsl:if> 

Siempre se devuelve verdadero cuando se supone que es falso. ¿Por qué?

+2

Sólo una sugerencia, pero es posible que también consiga un mejor calibre de respuesta si usted escribe su título como una pregunta adecuada y evitar que el l33t hable. –

+0

Gracias chicos, lo siento. – sydlawrence

Respuesta

160

El valor de la variable $ var como se define en:

      <xsl:variable name="var" select="boolean('false')"/>

es

      true()

Ésta es becaus e en XPath "false" es una cadena ordinaria, a diferencia de false(), que es el constructor para el valor booleanfalse()

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

      true() y false()

El detalle de conve rting cualquier valor a boolean se explican en el XPath Spec.:

"La función boolean convierte su argumento para un booleano como sigue:

  • un número es verdadero si y sólo si es ni positiva o negativa cero ni NaN

  • una node-set es verdadero si y solo si no está vacío

  • una cadena es verdadera si y solo si es longitud no es cero

  • un objeto de un tipo distinto a los cuatro tipos básicos se convierte en un valor booleano de una manera que depende de ese tipo "

En su caso la cadena de "falso" no es el número 0 y tiene una longitud positiva, por lo que se aplica la regla en el tercer punto anterior, obteniendo true().

Por lo tanto, para definir una variable en XSLT 1.0, cuyo valor esfalse(), hay que escribir la definición como la siguiente:

      <xsl:variable name="vMyVar" select="false()"/>

o, si no lo hace recordar exactamente esto, siempre se podría escribir:

      <xsl:variable name="vMyVar" select="1 = 0"/>

(especifique cualquier expresión que evalúe a false()) y el procesador XSLT hará el trabajo por usted.

En XSLT 2.0, siempre es mejor para especificar explícitamente el tipo de la variable:

      <xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>

+0

@DimitreNovatchev Hola Dimitre. Esta es la solución si el valor booleano está codificado en el archivo de transformación XSL.¿Existe una solución clara para las cadenas 'false' y' true' que provienen del archivo en transformación y que no implica la comparación de cadenas? – Jagger

+1

@Jagger, esto es por otra pregunta. Esta pregunta pregunta "* Cómo crear un valor booleano *" y obtuvo su respuesta precisa. Usted está preguntando: "* Cómo interpretar (o analizar) cadenas particulares en valores booleanos *" - esta es una pregunta completamente diferente. ¿Puedo preguntar qué pasa con la comparación de cadenas? –

16

La función booleana() que está utilizando está haciendo su trabajo. Para poder utilizar los valores verdaderos y falsos explícitas que puedes usar las siguientes funciones:

<xsl:variable name="var_false" select="false()"/> 
<xsl:variable name="var_true" select="true()"/> 

Para su información, por el MSDN documentation, boolean() devuelve lo siguiente:

  • Si el argumento es un número negativo o positivo , se convierte en el valor booleano verdadero.
  • Si el argumento es cero o un valor NaN, se convierte en falso.
  • Si el argumento es un conjunto de nodos 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 true. Una cadena vacía se convierte en falsa.
  • Si el argumento es 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.
+0

Debe reformatear el penúltimo elemento de su lista para destacarse más, ya que es el más importante. "boolean ('')" produciría falso también. – Tomalak

+2

@Tomalak, mira mi respuesta. Es un poco más detallado y cita la verdadera fuente: el W3C XPath Spec, en lugar de "MSDN". –

+1

@Dimitre: No creo que MSDN se desvíe demasiado de la especificación W3C en este sentido. :) Pero señalar * allí * es, por supuesto, más correcto. – Tomalak

5

Un poco tarde en esta etapa quizá pero En mi opinión se trata de booleanos es simplemente no vale la pena el esfuerzo. He aquí cómo tuve que lidiar con un valor lógico (Obligatorio) regresando de la BD:

<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

Cuestiones relacionadas