Comment créer une valeur booléenne?
Question
Je suis totalement nouveau dans 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>
Cela retourne toujours vrai quand il est censé être faux. Pourquoi?
La solution
La valeur de la variable $ var telle que définie dans:
& nbsp; & nbsp; & nbsp; < xsl: nom de variable = " var " select = " boolean ('false') " / >
est
& nbsp; & nbsp; & nbsp; true ()
Cela est dû au fait que dans XPath " false
" est une chaîne ordinaire, par opposition à false ()
, qui est le constructeur de la valeur boolean
false ()
Les deux valeurs booléennes de XPath sont (notez qu'elles sont construites!):
& nbsp; & nbsp; & nbsp; true ()
et false ()
Le détail de la conversion de toute valeur en valeur booléenne est décrit dans la Spécification XPath .:
" La fonction booléenne convertit sa fonction. argument à un booléen comme suit:
-
un nombre est vrai si et seulement s'il n'est ni zéro positif ni négatif ni NaN
-
un ensemble de nœuds est vrai si et seulement si est non vide
-
une chaîne est vraie si et seulement si sa la longueur est différente de zéro
-
un objet d'un type autre que les quatre types de base est converti en un booléen de manière dépendante de ce type "
Dans votre cas, la chaîne " false " n’est pas le nombre 0 et a une longueur positive, la règle décrite dans la troisième puce ci-dessus est appliquée et donne true ()
.
Par conséquent, pour définir une variable dans XSLT 1.0, dont la valeur est false ()
, vous devez écrire la définition comme suit:
& nbsp; & nbsp; & nbsp; < xsl: nom de la variable = " vMyVar " select = " false () " / >
ou, si vous ne vous en souvenez pas exactement, vous pouvez toujours écrire:
& nbsp; & nbsp; & nbsp; < xsl: nom de la variable = " vMyVar " select = "1 = 0" / >
(spécifiez toute expression dont le résultat est false ()
) et le processeur XSLT fera le travail à votre place.
Dans XSLT 2.0, il est toujours préférable de spécifier explicitement le type de la variable:
& nbsp; & nbsp; & nbsp; < xsl: nom de la variable = " vMyVar " as = " xs: boolean " select = " false () " / >
Autres conseils
La fonction boolean () que vous utilisez fait bien son travail. Pour utiliser des valeurs explicites true et false, utilisez les fonctions suivantes:
<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>
À titre d'information, 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 false.
- Si l'argument est un ensemble de nœuds non vide, il est converti en true. Un ensemble de nœuds vides est converti en false.
- Si l'argument est une chaîne non vide, il est converti en true . 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 un booléen de manière dépendante de ce type.
Un peu en retard à ce stade peut-être, mais le traitement des booléens ne vaut tout simplement pas la peine. Voici comment j'ai traité un booléen (obligatoire) qui revient 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