2008-09-17 22 views

Répondre

22

A partir de XQuery 1.1, utilisez l'interrupteur:

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 n'a pas de fonction pour activer autre chose que des éléments.

La première chose à faire est de convertir votre chaîne en un élément.

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

Ensuite, il suffit d'utiliser typeswitch pour faire un interrupteur normal:

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

S'il vous plaît noter, cela peut être une MarkLogic seule solution.

+1

Cette solution (devrait) travailler dans un processeur XQuery, mais pas aussi clair que la simple imbriqué si la solution. –

+0

Je déteste juste imbriqué si. J'aime l'exemple de XQuery 1.1 donc je l'ai marqué comme réponse. – Sixty4Bit

3

Il suffit d'utiliser une série d'expressions si:

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

L'utilisation d'un typeswitch se cache ce que vous faites vraiment.

La méthode la plus efficace dépend du processeur XQuery que vous utilisez. Dans un monde idéal, cela ne devrait être qu'une question de goût, car c'est à l'optimiseur qu'il revient de choisir la méthode appropriée, mais si la performance est importante, il vaut la peine de comparer les deux versions. Je serais très surpris si un processeur optimisait la construction du nœud de votre exemple et n'optimisait pas mon exemple à un commutateur spécialisé.

+0

Parfois, il est agréable et élégant de cacher ce que vous faites vraiment si vous n'oublier pas que vous le faites ... – Ar3s

+0

J'ai voté parce que la question tente de trouver la syntaxe de commutateur/cas pas si/sinon. – Sixty4Bit

+0

@ Sixty4Bit - Quand j'ai répondu à la question, le comportement de switch n'était pas finalisé, c'est pourquoi j'ai posté ma deuxième réponse en février! –

2

Si votre processeur prend en charge XQuery 1.1, vous pouvez simplement faire:

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