xsl:当多个条件的测试被视为'或'而不是'和'时

use*_*439 24 xslt conditional

我正在尝试创建一个xsl:choose语句,其中包含多个要测试的条件.到目前为止,我有这个:

<xsl:choose>
    <xsl:when test="$AccountNumber != '12345' and $Balance != '0'">
       <do stuff here>
       ...
Run Code Online (Sandbox Code Playgroud)

问题是'和'被视为'或'.如果帐号为12345或帐户余额为0,则将条件视为true并执行代码.我需要测试两个条件必须是真的...我的语法有错吗?

提前谢谢,〜蒂姆

Dim*_*hev 40

问题是'和'被视为'或'.

不,问题是您正在使用XPath !=运算符而您并不知道它的"怪异"语义.

方案:

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

在您的具体情况:

替换:

<xsl:when test="$AccountNumber != '12345' and $Balance != '0'">
Run Code Online (Sandbox Code Playgroud)

:

<xsl:when test="not($AccountNumber = '12345') and not($Balance = '0')">
Run Code Online (Sandbox Code Playgroud)

说明:

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

所以:

 $someNodeSet != $someValue
Run Code Online (Sandbox Code Playgroud)

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

 not($someNodeSet = $someValue)
Run Code Online (Sandbox Code Playgroud)

后者(根据定义)恰好在没有$someNodeSet其字符串值等于的节点时$someValue.

要吸取的教训:

!=除非您完全确定自己知道自己在做什么,否则切勿使用操作员.


JLR*_*she 8

如果$AccountNumber或是$Balance节点集,则很容易发生此行为.这不是因为and被视为or.

例如,如果$AccountNumber提到的节点与所述值1234566$Balance被称为节点与所述值550,然后 $AccountNumber != '12345'将是真实(因为66不等于12345),并$Balance != '0'将是真实(因为55不等于0).

我建议尝试这样做:

<xsl:when test="not($AccountNumber = '12345' or $Balance = '0')">
Run Code Online (Sandbox Code Playgroud)

$AccountNumber = '12345' or $Balance = '0'只要有$AccountNumber12345或者有$Balance0,就会出现真实情况,如果适用于此值not(),您将得到错误的结果.

  • 很好地使用了德摩根定律. (2认同)