1

concat如果输入字符串包含一个双引号,则添加另一个双引号。我在eXide上使用 XQuery 3.1 。A̶F̶A̶I̶K̶,̶̶e̶X̶i̶d̶e̶̶u̶s̶e̶s̶̶S̶a̶x̶o̶n̶̶a̶s̶̶X̶Q̶u̶e̶r̶y̶̶e̶n̶g̶i̶n̶e̶.̶(它没有,请参阅下面的 joewiz 回答)。
当我评估连接的字符串时会出现该错误。

return concat("'", 'bar')评估'bar预期的结果。

return concat('"', 'bar')评估为""bar

怎么会?我认为xquery 中的单引号和双引号没有区别

这是我的脚本:

xquery version "3.1";
let $c := concat('"','car')
return $c
4

2 回答 2

2

默认情况下,eXide 使用标准的自适应输出方法对查询结果进行序列化。由于该concat()函数返回一个字符串,自适应输出将字符串用双引号括起来,并通过加倍来转义字符串中的任何双引号。这解释了您所看到的现象。

从上面链接的 W3C 规范:

xs:string, xs:untypedAtomicor的实例xs:anyURI通过将值括在双引号中并将值中的任何引号加倍来进行序列化。

如果您希望在没有任何此类引号转义的情况下查看结果,则可以使用 eXide 查询输出窗格上方的下拉菜单并选择“文本方法”或“XML 方法”。

eXide 的文档(可通过帮助 > 文档查看)解释其序列化功能和默认设置如下:

在 2.4.0 中,eXide 抛弃了其长期存在的“漂亮打印”库,现在使用 eXist 的内置序列化方法。此更改意味着在查看查询结果时提高了空格的准确性和速度,并将 eXide 变成了序列化沙箱。通过“输出”下拉菜单切换输出方法,您不仅可以将查询结果序列化为自适应、JSON、XML 或旧的“直接”(渲染)方法,还可以序列化为文本、HTML5、XHTML、XHTML5 和微XML。新的“缩进”复选框可让您切换查询结果是否缩进。

最后,我应该指出,eXist 有自己的本地 XQuery 引擎,并且 eXide 将查询直接传递给 eXist 执行,而不是传递给 Saxon。eXist 仅将 Saxon 用于 XSLT - 即,当您使用transform模块从 XQuery 调用 XSLT 时。

于 2018-08-25T03:19:28.333 回答
0

这不是普遍的。使用任一引号字符作为字符串边界来评估 XQuery 的方式没有区别。但是,带引号的字符串表达式中的字符是按字面计算的。在您的示例中,您必须在字符串中使用另一个引号字符,因为否则它不会解析 ( """or ''')。但是您仍然可以通过转义与用于绑定字符串表达式的引号匹配的引号来使用您想要的任何文字引号字符。您可以通过连续使用其中两个来做到这一点:

concat('''', 'bar'), concat("""", 'bar')
=>
'bar
"bar

为了提高可读性,您还可以使用相应的实体&quotefor"'for '。这些规则在此处的规范中进行了解释:https ://www.w3.org/TR/xquery-30/#doc-xquery30-EscapeQuot

于 2018-08-23T15:47:50.360 回答