Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在XQuery中打开字符串?_Xml_Switch Statement_Xquery_Case - Fatal编程技术网

Xml 如何在XQuery中打开字符串?

Xml 如何在XQuery中打开字符串?,xml,switch-statement,xquery,case,Xml,Switch Statement,Xquery,Case,我有一个外部变量作为字符串输入,我想对它做一个开关/大小写。在xquery中如何做到这一点?xquery没有打开除元素之外的任何东西的功能 首先要做的是将字符串转换为元素 let$str:=“厨房” 设$room:=元素{$str}{} 然后只需使用typeswitch进行正常切换: 返回式开关($room) 案例元素(浴室)返回“厕所” 案例元素(厨房)返回“餐具室” 默认返回“仅一个房间” 请注意,这可能是仅适用于MarkLogic的解决方案。只需使用一系列if表达式即可: 如果($ro

我有一个外部变量作为字符串输入,我想对它做一个开关/大小写。在xquery中如何做到这一点?

xquery没有打开除元素之外的任何东西的功能

首先要做的是将字符串转换为元素

let$str:=“厨房”
设$room:=元素{$str}{}
然后只需使用typeswitch进行正常切换:

返回式开关($room)
案例元素(浴室)返回“厕所”
案例元素(厨房)返回“餐具室”
默认返回“仅一个房间”

请注意,这可能是仅适用于MarkLogic的解决方案。

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

如果($room eq“浴室”)则为“厕所”
否则如果($room eq“厨房”)则为“餐具室”
否则“就一个房间”
使用类型开关隐藏了你真正在做的事情


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

对于Saxon,您可以使用以下内容:

声明函数a:fn($i){
打字开关($i)
case元素(a:elemen1,xs:untyped)返回“a”
case元素(a:elemen2,xs:untyped)返回“b”
默认返回”错误
};

如果您的处理器支持XQuery 1.1,那么您只需执行以下操作:

交换机($room)
案例“浴室”返回“厕所”
案例“厨房”返回“餐具室”
默认返回“仅一个房间”

从XQuery 1.1开始,使用开关:

开关($animal)
案例“Cow”返回“Moo”
案例“猫”返回“喵”
案例“鸭子”返回“嘎嘎”
默认返回“那是什么奇怪的噪音?”

这个解决方案可以(应该)在任何xquery处理器中使用,但没有直接的嵌套if解决方案那么清晰。我只是讨厌嵌套if。我喜欢XQuery 1.1示例,所以我将其标记为答案。有时候,如果你不忘记自己正在做什么,那么隐藏你真正做的事情是很好和优雅的……我对此投了反对票,因为问题是试图找到switch/case而不是if/else的语法。@Sixty4Bit-当我回答问题时,switch的行为没有最终确定,这就是为什么我在二月份发布了我的第二个答案!