2010-06-03 5 views
6

Pourquoitest = "" sur un booléen retourne toujours vrai

<xsl:if test="<XPATH to boolean value here>"> 
... 
</xsl:if> 

renvoie toujours?

Comme boolean peut être 0,1, "false" et "true" par définition, la seule façon de tester une valeur booléenne est de faire une comparaison de chaînes par rapport à celles-ci. Cela ne peut pas être juste.

+0

pouvez-vous s'il vous plaît poster votre expression XPath actuelle avec un fragment XML? –

+0

Ce n'est pas une question du tout. S'il vous plaît, donnez un exemple spécifique - quelle est exactement l'expression XPath et quel est le fichier XML (le plus simple possible, s'il vous plaît) sur lequel cette expression XPath est évaluée? –

+0

Préfère voir un exemple, je suppose qu'il y a une erreur mineure dans la syntaxe. –

Répondre

8

Le test spécifié dans <xsl:if> fonctionne comme si elle appelle la fonction boolean. Cette fonction ne fonctionne pas comme vous le pensez. Si son argument évalue à un ensemble de nœuds (ce qui sera le cas si vous utilisez un chemin comme argument), il retournera vrai si l'ensemble de nœuds n'est pas vide, et faux sinon. Donc, efficacement, vous testez l'existence d'un élément, pas sa valeur. Si foo contient false,

<xsl:if test="/path/to/foo"> 

évaluera toujours vrai, puisque ce que vous demandez vraiment dans ce test est « cet élément n'existe? » et non "la valeur de l'élément est-elle vraie?" Et l'élément existe.

La règle selon laquelle les valeurs booléennes doivent être true, false, 1 ou 0 est une partie du schéma XML (which see) et non XPath, qui ne sait rien au sujet de cette règle. (XPath 1.0, c'est-à-dire XPath 2.0/XQuery 1.0 a the fn:boolean function, ce qui rend intelligent, ie le schéma XML, l'évaluation des valeurs booléennes.) Pour déterminer si une valeur est vraie dans XSLT, vous devez le vérifier explicitement:

<xsl:if test="/path/to/foo = 'true' or /path/to/foo = '1'"> 
+0

Si je lis correctement http://www.w3.org/TR/xpath/#section-Boolean-Functions, il ne devrait y avoir aucune différence entre les deux tests. En fait, xsl: if est spécifié pour convertir le résultat du test comme si c'était un appel à la fonction booléenne. –

+0

Vous savez, je le savais. Corrigée. –

+0

Dans l'exemple ci-dessus, vous rencontrerez un problème lorsque vous utiliserez un processeur compatible avec le schéma. Puisque le processeur sait à partir du schéma que/path/to/foo est xs: boolean, il produira un message d'erreur "Impossible de comparer xs: boolean à xs: string". J'ai exactement ce problème (avec un attribut booléen) - et je ne sais pas vraiment comment le résoudre. De l'aide? –

0

La spécification xpath donne une fonction booléenne. Ainsi, booléen (Valeur) retournera toujours vrai ou faux.

Questions connexes