【发布时间】:2010-09-10 06:56:29
【问题描述】:
我有一个以字符串形式出现的外部变量,我想对其进行开关/大小写。我如何在 xquery 中做到这一点?
【问题讨论】:
标签: xml switch-statement xquery case
我有一个以字符串形式出现的外部变量,我想对其进行开关/大小写。我如何在 xquery 中做到这一点?
【问题讨论】:
标签: xml switch-statement xquery case
从 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"
使用类型开关隐藏了你真正在做什么。
这些方法中哪种最有效将取决于您使用的 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"
【讨论】:
对于撒克逊人,您可以使用如下内容:
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;"
};
【讨论】: