Ich habe eine externe Variable, die als String eingeht, und ich möchte einen Schalter/Fall darauf machen. Wie mache ich das in xquery?Wie schalte ich eine Zeichenkette in XQuery ein?
Antwort
Beginnend mit XQuery 1.1, verwenden Schalter:
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?"
XQuery hat keine Funktion, um etwas anderes als Elemente einzuschalten.
Das erste, was Sie tun, ist Ihre Zeichenfolge in ein Element zu konvertieren.
let $str := "kitchen"
let $room := element {$str} {}
Dann einfach typeswitch verwenden, um einen normalen Schalter zu tun:
return typeswitch($room)
case element(bathroom) return "loo"
case element(kitchen) return "scullery"
default return "just a room"
Bitte beachten Sie, diese einzige Lösung, ein Marklogic sein kann.
Verwenden Sie einfach eine Reihe von if Ausdrücke:
if ($room eq "bathroom") then "loo"
else if ($room eq "kitchen") then "scullery"
else "just a room"
ein typeswitch Verwendung versteckt, was Sie wirklich tun.
Welche dieser Methoden am effizientesten ist, hängt vom verwendeten XQuery-Prozessor ab. In einer idealen Welt sollte es nur eine Frage des Geschmacks sein, da es auf den Optimierer angewiesen sein sollte, die geeignete Methode auszuwählen, aber wenn Leistung wichtig ist, lohnt es sich, beide Versionen zu vergleichen. Ich wäre sehr überrascht, wenn ein Prozessor die Knotenkonstruktion aus Ihrem Beispiel optimiert hätte und mein Beispiel nicht auf einen spezialisierten Switch optimiert hätte.
Manchmal ist es schön und elegant zu verbergen, was Sie wirklich tun, wenn Sie nicht vergessen, dass Sie es tun ... – Ar3s
Ich habe dies gewählt, weil die Frage versucht, die Syntax von switch/case nicht if/else zu finden. – Sixty4Bit
@ Sixty4Bit - Als ich die Frage beantwortete, war das Verhalten von Switch nicht abgeschlossen, weshalb ich meine zweite Antwort im Februar gepostet habe! –
Für Saxon, Sie so etwas wie diese verwenden:
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;"
};
Grüße,
http://rrusin.blogspot.com/2010/01/embedding-xquery-in-java.html
Wenn Ihr Prozessor XQuery 1.1 unterstützt, dann können Sie einfach tun:
switch ($room)
case "bathroom" return "loo"
case "kitchen" return "scullery"
default return "just a room"
Diese Lösung wird (soll) arbeitet in jedem xquery Prozessor, ist aber nicht so klar wie die einfachen verschachtelten if Lösung. –
Ich hasse einfach verschachtelt, wenn's ist. Ich mag das XQuery 1.1-Beispiel, daher habe ich es als Antwort markiert. – Sixty4Bit