Recentemente ho lavorato con xslt e ho avuto problemi a capire la differenza tra | e o e quando dovrei usare quale. Capisco che posso semplicemente usare i messaggi di errore per capire quale ho bisogno di usare, ma sono interessato a imparare perché non posso usare l’uno o l’altro.
Qualcuno sarebbe in grado di aiutarmi a indicarmi la giusta direzione verso un luogo in cui posso imparare la differenza?
|
riguarda i nodes, or
si occupa di “verità”, cioè valori booleani.
Il |
o operatore union
Questo operatore restituisce l’ unione di due sequenze che, in questo caso, vengono interpretate come due insiemi di nodes. Un dettaglio interessante è che l’operatore unione rimuove eventuali nodes duplicati. Inoltre, accetta solo operandi del tipo node()*
, cioè una sequenza di nodes. I nodes vengono restituiti nell’ordine del documento.
L’operatore or
Il termine tecnico per questo operatore è Boolean Disjunction . Richiede due argomenti, che devono entrambi valutare singolarmente un valore booleano (“true” o “false”). O, più precisamente, gli operandi di or
sono aggiunti in base al loro valore booleano effettivo convertendoli in xs:boolean
. A proposito, tutto ciò vale anche per l’operatore and
.
Utilizza l’operatore union
per ingrandire un insieme di nodes, in genere in una corrispondenza modello:
Perché non usare l’operatore or
qui? Poiché l’attributo di match
prevede un set di nodes come valore. union
restituisce un insieme di nodes, mentre l’operatore or
restituisce un valore booleano. Non è ansible definire una corrispondenza modello per un booleano.
Utilizza l’operatore or
per implementare le alternative nel codice XSLT, principalmente usando xsl:if
o xsl:choose
:
Se uno qualsiasi dei due operandi di questa operazione or
operazione è true
, allora anche il contenuto di xsl:if
verrà valutato. Ma non solo i confronti come “minore di” ( lt
) hanno un valore booleano, anche il seguente è perfettamente legale:
L’espressione sopra riportata è true
se almeno una delle due variabili è una sequenza non vuota. Questo perché una sequenza vuota è definita per avere il valore booleano effettivo di false
.
Si noti che a causa del modo in cui XSLT costruisce le cose ai tipi appropriati, ci sono alcuni contesti in cui è ansible utilizzare entrambi gli operatori. Considera questi due condizionali:
... ...
I primi test condizionali indicano se l’unione dell’insieme di elementi secondari denominati Root
e dell’insieme di elementi secondari denominati Jon
non è vuota. L’espressione Root | Jon
Root | Jon
restituisce una sequenza di nodes, e quindi quella sequenza è forzata ad un valore booleano perché if
richiede un valore booleano; se la sequenza non è vuota, il valore booleano effettivo è true.
Il secondo test condizionale verifica se uno dei due gruppi di bambini (bambini chiamati Root
e figli chiamati Jon
) non è vuoto. L’espressione Root or Jon
restituisce un valore booleano e, poiché l’operatore or
richiede degli argomenti booleani, i due insiemi vengono convertiti in booleano, quindi viene applicato l’operatore or
.
Il risultato è lo stesso, ma (come vedi) le due espressioni raggiungono quel risultato in modi leggermente diversi.