Domanda

Ho una variabile esterna che arriva come stringa e vorrei fare un interruttore/caso su di essa.Come posso farlo in xquery?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top