26

テストする条件が複数ある xsl:choose ステートメントを作成しようとしています。これまでのところ、私はこれを持っています:

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

問題は、「and」が「or」として扱われていることです。口座番号が 12345 の場合、または口座の残高が 0 の場合、条件は true として扱われ、コードが実行されます。両方の条件が真でなければならないというテストが必要です...ここで構文が間違っていますか?

前もって感謝します、〜ティム

4

3 に答える 3

44

問題は、「and」が「or」として扱われていることです。

いいえ、問題は、XPath!=演算子を使用していて、その「奇妙な」セマンティクスを認識していないことです。

解決策:

x != yany式を式に置き換えるだけnot(x = y)です。

あなたの特定のケースでは

置換:

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

:

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

説明:

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

だから

 $someNodeSet != $someValue

通常、次と同じ結果は得られません。

 not($someNodeSet = $someValue)

後者 (定義による) は$someNodeSet、文字列値が に等しいノードが存在しない場合に正確に真$someValueです。

学ぶべき教訓

!=自分が何をしているのかを完全に理解している場合を除き、この演算子を使用しないでください。

于 2013-03-21T03:00:02.563 に答える
8

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

たとえば、 が$AccountNumberと の値を持つノードを参照し、 が と の値を持つノードを参照する場合、12345はtrue (は と等しくないため) になり、は true (は と等しくないため) になります。66$Balance550$AccountNumber != '12345'6612345$Balance != '0'550

代わりにこれを試すことをお勧めします:

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

$AccountNumber = '12345' or $Balance = '0'値を持つがあるとき、または$AccountNumber値 を持つがあるときはいつでも true になります。それに適用すると、false の結果が得られます。12345$Balance0not()

于 2013-03-20T15:26:53.300 に答える
0

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

<xsl:when test="not($AccountNumber = '12345') and not($Balance = '0')" />
于 2013-03-20T16:51:36.817 に答える