2008-09-17 10 views

ответ

22

Начиная с 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

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 решение.

+1

Это решение будет (должен) работать в любом XQUERY процессоре, но не так ясно, как простая вложенным, если решение. – 2009-05-06 17:20:24

+0

Я просто ненавижу вложенные, если. Мне нравится пример XQuery 1.1, поэтому я отметил его как ответ. – Sixty4Bit 2010-05-06 20:45:46

3

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

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

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

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

2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^