web-dev-qa-db-fra.com

Comment créer une valeur booléenne?

Je suis totalement nouveau sur XSLT et je ne peux pas déterminer où je me trompe avec le code suivant.

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

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

Il revient toujours vrai quand il est censé être faux. Pourquoi?

82
sydlawrence

La valeur de la variable $ var telle que définie dans:

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

est

true()

En effet, dans XPath "false" est une chaîne ordinaire, par opposition à false(), qui est le constructeur de la valeur de booleanfalse()

Les deux valeurs booléennes dans XPath sont (notez qu'elles sont construites!):

true() et false()

Le détail de la conversion de n'importe quelle valeur en booléen est expliqué dans XPath Spec .:

"La fonction booléenne convertit son argument en booléen comme suit:

  • un nombre est vrai si et seulement s'il n'est ni positif ni négatif ni NaN

  • un ensemble de nœuds est vrai si et seulement s'il n'est pas vide

  • une chaîne est vraie si et seulement si sa longueur n'est pas nulle

  • un objet d'un type autre que les quatre types de base est converti en booléen d'une manière qui dépend de ce type "

Dans votre cas, la chaîne "false" n'est pas le numéro 0 et a une longueur positive, donc la règle de la troisième puce ci-dessus est appliquée, ce qui donne true().

Par conséquent, pour définir une variable dans XSLT 1.0, dont la valeur est false() , il faut écrire la définition comme suit:

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

ou, si vous ne vous en souvenez pas exactement, vous pouvez toujours écrire:

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

(spécifiez toute expression qui s'évalue en false()) et le processeur XSLT fera le travail pour vous.

Dans XSLT 2.0, il est toujours préférable de spécifier explicitement le type de la variable:

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

164
Dimitre Novatchev

La fonction booléenne () que vous utilisez fait en effet son travail. Pour utiliser des valeurs explicites vrai et faux, vous devez utiliser les fonctions suivantes:

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

Juste pour info, selon le documentation MSDN , boolean () renvoie ce qui suit:

  • Si l'argument est un nombre négatif ou positif, il est converti en valeur booléenne true.
  • Si l'argument est zéro ou une valeur NaN, il est converti en faux.
  • Si l'argument est un ensemble de nœuds non vide, il est converti en vrai. Un ensemble de nœuds vide est converti en faux.
  • Si l'argument est une chaîne non vide, il est converti en vrai . Une chaîne vide est convertie en false.
  • Si l'argument est un objet d'un type autre que les quatre types de base, il est converti en booléen d'une manière qui dépend de ce type.
17
Yuval Adam

Peut-être un peu tard à ce stade, mais l'imo traitant des booléens ne vaut tout simplement pas l'effort. Voici comment j'ai traité un booléen (obligatoire) revenant de la DB:

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

J'espère que cela aide quelqu'un

5
outofcoolnames