Qual è la differenza tra “o” e “|” quando si programma in xslt?

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.

Spiegazione

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 .

Esempi

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 .


Coercizione

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.

Dalla documentazione

| – L’operatore del sindacato. Ad esempio, l’attributo di corrispondenza nell’elemento corrisponde a tutti gli elementi e

or – Verifica se la prima o la seconda espressione sono true . Se la prima espressione è true , la seconda non viene valutata.