88 votes

Comment créer une valeur booléenne ?

Je suis totalement novice en matière de XSLT et je ne parviens 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 renvoie toujours le vrai alors qu'il est censé être le faux. Pourquoi ?

3 votes

Ce n'est qu'une suggestion, mais vous obtiendrez sans doute une réponse de meilleure qualité si vous écrivez votre titre comme une vraie question et si vous évitez le jargon.

171voto

Dimitre Novatchev Points 147842

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 l'objet boolean valeur false()

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

   true() y false()

Les détails de la conversion de n'importe quelle valeur en booléen sont expliqués dans le manuel de l'utilisateur. Spec XPath . :

"Le boolean convertit son argument en booléen comme suit :

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

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

  • une chaîne est vraie si et seulement si son longueur est non 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 nombre 0 et a une longueur positive, donc la règle du 3ème point 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écifier toute expression dont l'évaluation est 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()"/>

0 votes

@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 false y true les chaînes de caractères provenant du fichier faisant l'objet d'une transformation qui n'implique pas la comparaison de chaînes de caractères ?

1 votes

@Jagger, C'est pour une autre question. Cette question demande " Comment créer une valeur booléenne " et a obtenu sa réponse précise. Vous demandez : " Comment interpréter (ou analyser) certaines chaînes de caractères en valeurs booléennes ? "C'est une question complètement différente. Puis-je vous demander ce qui ne va pas avec la comparaison de chaînes de caractères ?

18voto

Yuval Adam Points 59423

La fonction boolean() que vous utilisez fait bien son travail. Pour utiliser des valeurs vraies et fausses explicites, 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 la 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 de caractères non vide, il est converti en vrai. . Une chaîne vide est convertie en faux.
  • 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.

0 votes

Vous devriez reformater l'avant-dernier élément de votre liste pour qu'il ressorte davantage, car c'est l'élément crucial. "boolean('')" produirait également false.

2 votes

@Tomalak, voir ma réponse. Elle est un peu plus détaillée et cite la vraie source : le W3C XPath Spec, plutôt que "MSDN".

1 votes

@Dimitre : Je ne pense pas que MSDN s'écarte trop de la spécification du W3C à cet égard. :) Mais en pointant est bien sûr plus correct.

5voto

outofcoolnames Points 34

Il est peut-être un peu tard à ce stade, mais je pense que la manipulation des booléens n'en vaut pas la peine. Voici comment j'ai traité un booléen (obligatoire) provenant 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 aidera quelqu'un

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X