Come si attiva una stringa in XQuery?
-
01-07-2019 - |
Domanda
Ho una variabile esterna che arriva come stringa e vorrei fare un interruttore/caso su di essa.Come posso farlo in xquery?
Soluzione
A partire da XQuery 1.1, utilizzare switch:
http://www.w3.org/TR/xquery-11/#id-switch
switch ($animal)
case "Cow" return "Moo"
case "Cat" return "Meow"
case "Duck" return "Quack"
default return "What's that odd noise?"
Altri suggerimenti
Basta usare una serie di espressioni if:
if ($room eq "bathroom") then "loo"
else if ($room eq "kitchen") then "scullery"
else "just a room"
Usare un typeswitch nasconde ciò che stai realmente facendo.
Quale di questi metodi sia più efficiente dipenderà dal processore XQuery che stai utilizzando.In un mondo ideale dovrebbe essere solo una questione di gusti, in quanto dovrebbe spettare all'ottimizzatore selezionare il metodo appropriato, ma se le prestazioni sono importanti vale la pena confrontare entrambe le versioni.Sarei molto sorpreso se un processore ottimizzasse la costruzione del nodo dal tuo esempio e non ottimizzasse il mio esempio su uno switch specializzato.
XQuery non ha una funzione per attivare altro che elementi.
La prima cosa da fare è convertire la stringa in un elemento.
let $str := "kitchen"
let $room := element {$str} {}
Quindi usa semplicemente typewitch per eseguire un normale cambio:
return typeswitch($room)
case element(bathroom) return "loo"
case element(kitchen) return "scullery"
default return "just a room"
Tieni presente che questa potrebbe essere una soluzione esclusivamente MarkLogic.
Se il tuo processore supporta XQuery 1.1, puoi semplicemente fare:
switch ($room)
case "bathroom" return "loo"
case "kitchen" return "scullery"
default return "just a room"
Per Saxon, puoi usare qualcosa del genere:
declare function a:fn($i) {
typeswitch ($i)
case element(a:elemen1, xs:untyped) return 'a'
case element(a:elemen2, xs:untyped) return 'b'
default return "error;"
};
Saluti,
http://rrusin.blogspot.com/2010/01/embedding-xquery-in-java.html