Как вы включаете строку в XQuery? - PullRequest
11 голосов
/ 17 сентября 2008

У меня есть внешняя переменная, представленная в виде строки, и я хотел бы сделать для нее переключатель / регистр. Как мне это сделать в xquery?

Ответы [ 5 ]

22 голосов
/ 04 мая 2010

Начиная с 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's that odd noise?" 
3 голосов
/ 05 октября 2008

Просто используйте серию выражений if:

if ($room eq "bathroom") then "loo"
else if ($room eq "kitchen")  then "scullery"
else "just a room"

Использование переключателя типов скрывает то, что вы действительно делаете.

Какой из этих методов наиболее эффективен, зависит от используемого вами процессора XQuery. В идеальном мире это должен быть только вопрос вкуса, так как оптимизатор должен выбрать подходящий метод, но если важна производительность, стоит сравнить обе версии. Я был бы очень удивлен, если бы процессор оптимизировал конструкцию узла из вашего примера и не оптимизировал мой пример для специализированного коммутатора.

3 голосов
/ 17 сентября 2008

XQuery не имеет функции для включения чего-либо, кроме элементов.

Первое, что вы делаете, - конвертируете строку в элемент.

let $str := "kitchen"
let $room := element {$str} {}

Тогда просто используйте typeswitch для обычного переключения:

return typeswitch($room)
  case element(bathroom) return "loo"
  case element(kitchen) return "scullery"
  default return "just a room"

Обратите внимание, что это может быть решение только для MarkLogic.

2 голосов
/ 14 февраля 2010

Если ваш процессор поддерживает XQuery 1.1, то вы можете просто сделать:

switch ($room) 
  case "bathroom" return "loo"
  case "kitchen" return "scullery"
  default return "just a room"
1 голос
/ 18 января 2010

Для саксонцев вы можете использовать что-то вроде этого:

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

...