2013-03-20 5 views
22

Sto tentando di creare un xsl: scegliere l'istruzione con più condizioni da testare. Finora, ho questo:xsl: quando test con più condizioni trattate come 'o' invece di 'e'

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

Il problema è che la 'e' viene trattato come un 'o'. Se il numero di conto è 12345 o il saldo di un account è 0, la condizione viene considerata vera e il codice viene eseguito. Ho bisogno che il test sia che entrambe le condizioni siano vere ... ho la sintassi sbagliata qui?

Grazie in anticipo, ~ Tim

+0

Spero che [questa pagina] (http://www.java2s.com/Code/XML/XSLT-stylesheet/ifstatementwithandoperator.htm) aiuti –

+0

Che cosa contengono esattamente le variabili $ AccountNumber e $ Balance? I set di nodi vuoti, ad esempio, possono portare a risultati sorprendenti perché '$ empty-node-set! = '0'' sarà falso. – nwellnhof

+0

Come sono definiti $ AccountNumber e $ Balance? Per favore mostracelo. – JLRishe

risposta

6

Se $AccountNumber o $Balance è un set di nodi, allora questo comportamento potrebbe facilmente accadere. Non è perché and viene trattato come or.

Ad esempio, se $AccountNumber cui nodi con i valori 12345 e 66 e $Balance cui nodi con i valori 55 e 0, quindi $AccountNumber != '12345' sarebbe vero (perché 66 non è uguale a 12345) e $Balance != '0' sarebbe vero (perché 55 non è uguale a 0).

Io suggerirei di provare questo invece:

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

$AccountNumber = '12345' or $Balance = '0' sarà vero ogni volta che c'è un $AccountNumber con il valore 12345 o c'è un $Balance con il valore 0, e se si applica not() a quella , otterrai un risultato falso.

+2

Buon uso delle leggi di De Morgan. – Dan

0

Ho sempre usato questa sintassi, che produce risultati più prevedibili rispetto all'utilizzo di! =.

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

Entrambe le forme sono ugualmente "prevedibili" se si apprezza esattamente cosa si intende per significato. Se '$ AccountNumber' è un set di nodi contenente più nodi allora' $ AccountNumber! = '12345'' e 'not ($ AccountNumber =' 12345 ')' significano _fundamentalmente_ cose diverse - il primo è vero se esiste un nodo _any_ nell'insieme con un valore diverso da 12345, quest'ultimo solo se _none_ dei nodi nell'insieme ha valore 12345. –

32

Il problema è che la 'e' viene trattato come un 'o'.

No, il problema è che si sta utilizzando l'operatore XPath != e non si è a conoscenza della sua semantica "strano".

Soluzione:

Basta sostituire le eventuali x != y espressioni con un'espressione not(x = y).

Nel vostro caso specifico:

Sostituire:

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

con:

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

Spiegazione:

012.

Per definizione ogniqualvolta uno degli operandi dell'operatore != è un nodeset, il risultato della valutazione di questo operatore è vero se è presente un nodo nel set di nodi, il cui valore non è uguale all'altro operando.

Così:

$someNodeSet != $someValue 

generalmente non produce lo stesso risultato:

not($someNodeSet = $someValue) 

Quest'ultimo (per definizione) è vera esattamente quando non v'è un nodo in $someNodeSet il cui valore di stringa è uguale a $someValue.

lezione da imparare:

Non usare mai l'operatore !=, a meno che non si è assolutamente sicuri di sapere cosa si sta facendo.