26

我正在尝试创建一个带有多个条件的 xsl:choose 语句进行测试。到目前为止,我有这个:

<xsl:choose>
    <xsl:when test="$AccountNumber != '12345' and $Balance != '0'">
       <do stuff here>
       ...

问题是“和”被视为“或”。如果帐号为 12345 或账户余额为 0,则条件为真并执行代码。我需要测试两个条件都必须为真......我这里的语法错误吗?

在此先感谢,〜蒂姆

4

3 回答 3

44

问题是“和”被视为“或”。

不,问题在于您使用的是 XPath!=运算符,而您不知道它的“怪异”语义。

解决方案

只需用表达式替换任何x != y表达式not(x = y)

在您的具体情况下

替换

<xsl:when test="$AccountNumber != '12345' and $Balance != '0'">

<xsl:when test="not($AccountNumber = '12345') and not($Balance = '0')">

说明

根据定义,只要运算符的一个操作数!=是一个节点集,那么如果节点集中有一个节点的值不等于另一个操作数,则计算此运算符的结果为真。

所以

 $someNodeSet != $someValue

通常不会产生与以下相同的结果:

 not($someNodeSet = $someValue)

$someNodeSet后者(根据定义)在不存在字符串值等于的节点时为真$someValue

教训

切勿使用!=操作员,除非您绝对确定自己知道自己在做什么。

于 2013-03-21T03:00:02.563 回答
8

如果$AccountNumberor$Balance是一个节点集,那么这种行为很容易发生。这不是因为and被视为or.

例如,如果$AccountNumber用值12345和引用节点,并且用值66$Balance引用节点,那么 将是真的(因为不等于)并且会是真的(因为不等于)。550$AccountNumber != '12345'6612345$Balance != '0'550

我建议尝试这个:

<xsl:when test="not($AccountNumber = '12345' or $Balance = '0')">

$AccountNumber = '12345' or $Balance = '0'任何时候只要有一个$AccountNumber带有值的12345或有一个$Balance带有值的0,就会为真,如果你应用not()到那个,你会得到一个错误的结果。

于 2013-03-20T15:26:53.300 回答
0

我一直使用这种语法,它比使用 != 产生更可预测的结果。

<xsl:when test="not($AccountNumber = '12345') and not($Balance = '0')" />
于 2013-03-20T16:51:36.817 回答