2013-03-20 9 views
22

テストする複数の条件を持つxsl:choose文を作成しようとしています。これまでのところ、私はこれを持っています: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)が助けになることを願っています –

+0

変数$ AccountNumberと$ Balanceには正確に何が含まれていますか?たとえば、空のノードセットは、 '$ empty-node-set!= '0' 'が偽になるため、驚くべき結果につながる可能性があります。 – nwellnhof

+0

$ AccountNumberと$ Balanceはどのように定義されていますか?それを見せてください。 – JLRishe

答えて

6

$AccountNumberまたは$Balanceがノードセットである場合、この動作が簡単に発生する可能性があります。 andorと扱われているからではありません。例えば

は、$AccountNumber場合(6612345に等しくないので) $AccountNumber != '12345'が真であろうと$Balance != '0'が真となり、その後、値550でノードと呼ば値1234566$Balanceとノードと呼ば(550と等しくないため)。

私の代わりにこれをしようとお勧めしたい:

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

$AccountNumber = '12345' or $Balance = '0'$AccountNumberが値12345でありまたは値0$Balanceがある任意の時間trueになり、あなたはそれにnot()を適用した場合あなたは偽の結果を得るでしょう。

+2

De Morganの法律をうまく使います。 – Dan

0

私は常にこの構文を使用しましたが、これは!=を使用するよりも予測可能な結果が得られます。

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

両方のフォームは、それらの意味を正確に理解することができれば、同様に "予測可能"です。もし '$ AccountNumber'が2つ以上のノードを含むノード集合であれば、' $ AccountNumber!= '12345''と 'not($ AccountNumber =' 12345 ')'は意味的に異なることを意味します - 前者は、セット内のノードのうち_none_が値12345を持つ場合にのみ、12345とは異なる値を持つセット内の後者。 –

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')"> 

説明

定義によって、!=演算子のオペランドの1つがノードセットである場合はいつでも、値が他のオペランドと等しくないノードセットにノードがある場合、この演算子を評価した結果は真です。

だから

$someNodeSet != $someValue 

は、一般的に同じ結果を生成しないよう:

not($someNodeSet = $someValue) 

後者$someNodeSetにノードが存在しない正確場合(定義によって)が真であります文字列の値は$someValueです。を学ぶため

レッスン:あなたは、あなたが何をしているか知っている絶対に確信している場合を除き

!=演算子を使用しないでください。

関連する問題