J'essaie de créer une instruction xsl: choose avec plusieurs conditions à tester. Jusqu'à présent, j'ai ceci:
<xsl:choose>
<xsl:when test="$AccountNumber != '12345' and $Balance != '0'">
<do stuff here>
...
Le problème est que le "et" est traité comme un "ou". Si le numéro de compte est 12345 ou le solde d'un compte est 0, la condition est traitée comme vraie et le code est exécuté. J'ai besoin que le test vérifie que les deux conditions doivent être vraies ... la syntaxe est-elle incorrecte ici?
Merci d'avance, ~ Tim
Le problème est que le "et" est traité comme un "ou".
Non, le problème est que vous utilisez l'opérateur XPath !=
Et que vous ne connaissez pas sa sémantique "bizarre".
Solution:
Remplacez simplement les expressions x != y
Par une expression not(x = y)
.
Dans votre cas particulier:
Remplacer:
<xsl:when test="$AccountNumber != '12345' and $Balance != '0'">
avec:
<xsl:when test="not($AccountNumber = '12345') and not($Balance = '0')">
Explication:
Par définition, chaque fois que l'un des opérandes de l'opérateur !=
Est un ensemble de nœuds, le résultat de l'évaluation de cet opérateur est vrai s'il existe un nœud dans l'ensemble de nœuds, dont la valeur n'est pas égale à l'autre opérande .
Donc:
$someNodeSet != $someValue
ne produit généralement pas le même résultat que:
not($someNodeSet = $someValue)
Ce dernier (par définition) est vrai exactement quand il n'y a pas de nœud dans $someNodeSet
Dont la valeur de chaîne est égale à $someValue
.
Leçon à apprendre:
N'utilisez jamais l'opérateur !=
, Sauf si vous êtes absolument sûr de savoir ce que vous faites.
Si _$AccountNumber
_ ou _$Balance
_ est un ensemble de nœuds, ce problème peut facilement se produire. Ce n'est pas parce que and
est traité comme or
.
Par exemple, si _$AccountNumber
_ fait référence aux nœuds avec les valeurs _12345
_ et _66
_ et _$Balance
_ fait référence aux nœuds avec les valeurs _55
_ et _0
_, alors _$AccountNumber != '12345'
_ serait vrai (parce que _66
_ n'est pas égal à _12345
_) et _$Balance != '0'
_ serait vrai (parce que _55
_ n'est pas égal à _0
_).
Je suggère d'essayer ceci à la place:
_<xsl:when test="not($AccountNumber = '12345' or $Balance = '0')">
_
_$AccountNumber = '12345' or $Balance = '0'
_ sera vrai chaque fois qu'il y aura _$AccountNumber
_ avec la valeur _12345
_ ou il y aura _$Balance
_ avec la valeur _0
_, et si vous appliquez not()
à cela, vous obtiendrez un faux résultat.
J'ai toujours utilisé cette syntaxe, qui donne des résultats plus prévisibles que l'utilisation de! =.
<xsl:when test="not($AccountNumber = '12345') and not($Balance = '0')" />