Mam zmienną zewnętrzną wchodzącą jako ciąg i chciałbym zrobić przełącznik/case na nim. Jak to zrobić w Xquery?Jak włączyć ciąg znaków w XQuery?
Odpowiedz
Począwszy XQuery 1.1 za pomocą przełącznika:
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 nie ma funkcji do włączania elementów innych niż elementy.
Pierwszą rzeczą, którą robisz, jest zamiana łańcucha na element.
let $str := "kitchen"
let $room := element {$str} {}
Następnie wystarczy użyć typeswitch zrobić normalny przełącznik:
return typeswitch($room)
case element(bathroom) return "loo"
case element(kitchen) return "scullery"
default return "just a room"
Należy pamiętać, że może to być tylko MarkLogic rozwiązanie.
Wystarczy użyć serię jeśli wyrażenia:
if ($room eq "bathroom") then "loo"
else if ($room eq "kitchen") then "scullery"
else "just a room"
Korzystanie z typeswitch ukrywa to, co naprawdę robi.
Która z tych metod jest najbardziej wydajna, zależy od procesora XQuery, z którego korzystasz. W idealnym świecie powinno to być tylko kwestią gustu, ponieważ optymalizator powinien wybrać odpowiednią metodę, ale jeśli wydajność jest ważna, warto przetestować obie wersje. Byłbym bardzo zaskoczony, gdyby procesor zoptymalizował budowę węzła z twojego przykładu i nie zoptymalizował mojego przykładu do wyspecjalizowanego przełącznika.
Czasami jest miło i elegancko ukryć to, co naprawdę robisz, jeśli nie zapominasz, że robisz to ... – Ar3s
Głosowałem za tym, ponieważ pytanie próbuje znaleźć składnię przełącznika/case nie, jeśli/else. – Sixty4Bit
@ Sixty4Bit - Kiedy odpowiadałem na pytanie, zachowanie przełącznika nie zostało sfinalizowane, dlatego w lutym opublikowałem drugą odpowiedź! –
Dla Saxon, można użyć coś takiego:
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;"
};
Pozdrowienia,
http://rrusin.blogspot.com/2010/01/embedding-xquery-in-java.html
Jeśli procesor obsługuje XQuery 1.1, to możesz po prostu zrobić:
switch ($room)
case "bathroom" return "loo"
case "kitchen" return "scullery"
default return "just a room"
Roztwór ten (o) działają w każdym procesorze xquery, ale nie jest tak wyraźny jak proste zagnieżdżone jeśli roztwór. –
Po prostu nienawidzę zagnieżdżonych, jeśli jest. Podoba mi się przykład XQuery 1.1, więc oznaczyłem go jako odpowiedź. – Sixty4Bit