J'ai une variable externe qui se présente sous la forme d'une chaîne et j'aimerais y faire un interrupteur/boîtier. Comment est-ce que je fais cela dans xquery?Comment activer une chaîne dans XQuery?
Répondre
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?"
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.
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é.
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
J'ai voté parce que la question tente de trouver la syntaxe de commutateur/cas pas si/sinon. – Sixty4Bit
@ 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! –
Pour Saxon, vous pouvez utiliser quelque chose comme ceci:
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;"
};
Cordialement,
http://rrusin.blogspot.com/2010/01/embedding-xquery-in-java.html
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"
Cette solution (devrait) travailler dans un processeur XQuery, mais pas aussi clair que la simple imbriqué si la solution. –
Je déteste juste imbriqué si. J'aime l'exemple de XQuery 1.1 donc je l'ai marqué comme réponse. – Sixty4Bit