13

我有一个以字符串形式出现的外部变量,我想对其进行开关/大小写。我如何在 xquery 中做到这一点?

4

5 回答 5

25

从 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?" 
于 2010-05-04T16:19:41.650 回答
4

只需使用一系列 if 表达式:

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

使用类型开关隐藏了你真正在做什么。

哪种方法最有效将取决于您使用的 XQuery 处理器。在理想情况下,这应该只是一个品味问题,因为应该由优化器来选择合适的方法,但如果性能很重要,那么值得对两个版本进行基准测试。如果处理器从您的示例中优化了节点结构,并且没有将我的示例优化为专用开关,我会感到非常惊讶。

于 2008-10-05T11:30:59.460 回答
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 唯一的解决方案。

于 2008-09-17T17:47:44.767 回答
3

如果您的处理器支持 XQuery 1.1,那么您可以简单地执行以下操作:

switch ($room) 
  case "bathroom" return "loo"
  case "kitchen" return "scullery"
  default return "just a room"
于 2010-02-14T18:02:41.237 回答
1

对于撒克逊人,您可以使用以下内容:

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;"
};

https://rrusin.blogspot.com/2010/01/xquery4j-in-action.html

于 2010-01-18T02:42:28.273 回答