我正在尝试创建一个xsl:choose语句,其中包含多个要测试的条件。到目前为止,我有这个:
<xsl:choose>
<xsl:when test="$AccountNumber != '12345' and $Balance != '0'">
<do stuff here>
...
问题在于'和'被视为'或'。如果帐号为12345或帐户余额为0,则将条件视为true并执行代码。我需要测试是两个条件都必须是真的......我的语法有错吗?
提前致谢, 〜添
答案 0 :(得分:38)
问题在于'和'被视为'或'。
不,问题是你使用的是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
的节点时完全正确。
要学习的课程:
永远不要使用!=
运算符,除非您完全确定自己知道自己在做什么。
答案 1 :(得分:8)
如果$AccountNumber
或$Balance
是节点集,则很容易发生此行为。这不是因为and
被视为or
。
例如,如果$AccountNumber
引用值为12345
且66
且$Balance
的节点引用的值为55
和{{1的节点}}, 然后
0
将为真(因为$AccountNumber != '12345'
不等于66
)而12345
将为真(因为$Balance != '0'
不等于55
)。
我建议尝试这样做:
0
每当<xsl:when test="not($AccountNumber = '12345' or $Balance = '0')">
的值为$AccountNumber = '12345' or $Balance = '0'
或$AccountNumber
的值为12345
时, $Balance
都会为真,如果您将0
应用于此,您将得到错误的结果。
答案 2 :(得分:0)
我一直使用这种语法,这比使用!=。
产生更可预测的结果<xsl:when test="not($AccountNumber = '12345') and not($Balance = '0')" />