2013-03-20 39 views
22

我试图创建一个xsl:选择语句与多个条件来测试。到目前为止,我有这样的:xsl:当测试多个条件对待'或'而不是'和'

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

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

由于提前, 〜添

+0

我希望[本页](http://www.java2s.com/Code/XML/XSLT-stylesheet/ifstatementwithandoperator.htm)会帮助 – 2013-03-20 15:15:37

+0

变量$ AccountNumber和$ Balance究竟包含了什么?例如,空节点集可能会导致令人惊讶的结果,因为$ empty-node-set!='0'将是错误的。 – nwellnhof 2013-03-20 15:22:29

+0

如何定义$ AccountNumber和$ Balance?请告诉我们。 – JLRishe 2013-03-20 15:24:44

回答

6

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

例如,如果$AccountNumber称为节点与称为节点与所述值5501234566$Balance,然后 $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,如果你申请not()到,你会得到一个错误的结果。

+2

很好地使用德摩根定律。 – Dan 2014-01-30 15:49:54

0

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

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

如果您确切地意识到它们的定义是什么,那么两种形式都同样“可预测”。如果'$ AccountNumber'是一个包含多个节点的节点集,那么'$ AccountNumber!='12345''和'not($ AccountNumber ='12345')'意味着_fundamentally_不同的东西 - 前者是真的,如果有_any_节点在值不同于12345的集合中,后者仅当集合中的_none_节点具有值12345时才为后者。 – 2013-03-20 16:57:46

32

的问题是,该“和”被视为“或”。

不,问题是您正在使用XPath !=运算符,并且您不知道其“怪异”语义。

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

在您的具体情况

更换

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

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

说明

根据定义,只要!=运算符的其中一个操作数是节点集,则如果node-set中存在节点,其值不等于另一个操作数,则评估此运算符的结果为true。

所以

$someNodeSet != $someValue 

一般不会产生相同的结果:

not($someNodeSet = $someValue) 

后者(根据定义)为真恰好当没有在$someNodeSet一个节点其字符串值等于$someValue

课程学习

切勿使用!=操作,除非你有绝对的把握,你知道你在做什么。

相关问题