Вопрос

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

Это было полезно?

Решение

Начиная с XQuery 1.1, используйте switch:

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?" 

Другие советы

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

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

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

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

В 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.

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

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

Для 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top