web-dev-qa-db-fra.com

xsl: lors d'un test avec plusieurs conditions traitées comme 'ou' au lieu de 'et'

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

24
user2191439

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.

39
Dimitre Novatchev

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.

8
JLRishe

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')" />
0
Severin Foreman