У меня есть внешняя переменная, входящая в строку, и я хотел бы сделать переключатель /case на нем. Как это сделать в xquery?
Как включить строку в XQuery?
Ответ 1
Начиная с XQuery 1.1, используйте переключатель:
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 that odd noise?"
Ответ 2
XQuery не имеет функции для включения каких-либо элементов, кроме элементов.
Первое, что вы делаете, это преобразовать вашу строку в элемент.
let $str := "kitchen"
let $room := element {$str} {}
Затем просто используйте typwitch, чтобы сделать обычный переключатель:
return typeswitch($room)
case element(bathroom) return "loo"
case element(kitchen) return "scullery"
default return "just a room"
Обратите внимание: это может быть только решение MarkLogic.
Ответ 3
Просто используйте ряд выражений if:
if ($room eq "bathroom") then "loo"
else if ($room eq "kitchen") then "scullery"
else "just a room"
Использование typwitch скрывает то, что вы действительно делаете.
Какой из этих методов наиболее эффективен, будет зависеть от используемого вами процессора XQuery. В идеальном мире это должно быть только вопросом вкуса, так как это должно быть до оптимизатора, чтобы выбрать подходящий метод, но если производительность важна, стоит сопоставить обе версии. Я был бы очень удивлен, если бы процессор оптимизировал конструкцию node из вашего примера и не оптимизировал мой пример для специализированного коммутатора.
Ответ 4
Если ваш процессор поддерживает XQuery 1.1, вы можете просто сделать:
switch ($room)
case "bathroom" return "loo"
case "kitchen" return "scullery"
default return "just a room"
Ответ 5
Для Saxon вы можете использовать что-то вроде этого:
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;"
};
Привет,
http://rrusin.blogspot.com/2010/01/embedding-xquery-in-java.html