Comment créer une valeur booléenne?

86

Je suis totalement nouveau sur XSLT et je ne peux pas comprendre 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?

sydlawrence
la source
3
Juste une suggestion, mais vous obtiendrez peut-être une meilleure réponse si vous écrivez votre titre comme une question appropriée et évitez le discours l33t.
Will Dean

Réponses:

168

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

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

est

   true()

C'est parce que dans XPath " false" est une chaîne ordinaire, par opposition à false(), qui est le constructeur de la booleanvaleurfalse()

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

   true() et false()

Les détails de la conversion de toute valeur en booléen sont énoncés dans les spécifications XPath .:

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

  • un nombre est vrai si et seulement s'il n'est ni zéro positif ou 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 est différente de zéro

  • 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 nombre 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 donne la valeur 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()"/>

Dimitre Novatchev
la source
@DimitreNovatchev Salut Dimitre. C'est la solution si la valeur booléenne est codée en dur dans le fichier de transformation XSL. Existe-t-il une solution soignée pour les chaînes falseet les truechaînes provenant du fichier en cours de transformation qui n'implique pas de comparaison de chaînes?
Jagger
1
@Jagger, Ceci est pour une autre question. Cette question demande " Comment créer une valeur booléenne " et a sa réponse précise. Vous vous demandez: " Comment interpréter (ou analyser) des chaînes particulières en valeurs booléennes " - c'est une question complètement différente. Puis-je demander ce qui ne va pas avec la comparaison de chaînes?
Dimitre Novatchev
17

La fonction boolean () que vous utilisez fait effectivement son travail. Pour utiliser des valeurs explicites true et false, vous devez utiliser les fonctions suivantes:

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

Juste pour info, selon la 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.
Yuval Adam
la source
Vous devez reformater l'avant-dernier élément de votre liste pour vous démarquer davantage, car c'est l'élément crucial. "boolean ('')" produirait également false.
Tomalak
2
@Tomalak, voyez ma réponse. Il est un peu plus détaillé et cite la vraie source: le W3C XPath Spec, plutôt que "MSDN".
Dimitre Novatchev
1
@Dimitre: Je ne pense pas que MSDN s'écarte trop des spécifications du W3C à cet égard. :) Mais en pointant il est bien sûr plus correct.
Tomalak
5

Un peu tard à ce stade peut-être, mais je ne pense pas avoir à gérer les booléens. Voici comment j'ai traité un booléen (obligatoire) revenant de la base de données:

<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

outofcoolnames
la source