我有一个外部变量作为字符串输入,我想在它上面做一个开关/案例。我如何在xquery中做到这一点?
答案 0 :(得分:22)
从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?"
答案 1 :(得分: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的解决方案。
答案 2 :(得分:3)
只需使用一系列if表达式:
if ($room eq "bathroom") then "loo"
else if ($room eq "kitchen") then "scullery"
else "just a room"
使用typeswitch隐藏了你真正在做的事情。
哪种方法最有效取决于您使用的XQuery处理器。在一个理想的世界中,它应该只是一个品味问题,因为它应该由优化器来选择合适的方法,但如果性能很重要,则值得对两个版本进行基准测试。如果处理器优化了您的示例中的节点构造,并且没有将我的示例优化为专用交换机,我会感到非常惊讶。
答案 3 :(得分:2)
如果您的处理器支持XQuery 1.1,那么您只需执行以下操作:
switch ($room)
case "bathroom" return "loo"
case "kitchen" return "scullery"
default return "just a room"
答案 4 :(得分:1)
对于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