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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top