我正在尝试创建一个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.
要吸取的教训:
!=除非您完全确定自己知道自己在做什么,否则切勿使用操作员.
如果$AccountNumber或是$Balance节点集,则很容易发生此行为.这不是因为and被视为or.
例如,如果$AccountNumber提到的节点与所述值12345和66与$Balance被称为节点与所述值55和0,然后
$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'只要有$AccountNumber值12345或者有$Balance值0,就会出现真实情况,如果适用于此值not(),您将得到错误的结果.