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

时间:2013-03-20 15:11:24

标签: xslt conditional

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

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

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

提前致谢, 〜添

3 个答案:

答案 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引用值为1234566$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')" />