Concat 添加双引号

Concat adds double quotes

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̶e̶s̶̶S̶a̶x̶o̶n̶̶a̶s̶̶X̶Q̶u̶e̶r̶y̶̶e̶n̶g̶i̶e̶n̶̶e̶o̶.̶,见下文 当我评估连接的字符串时出现错误。

return concat("'", 'bar') 计算结果为 'bar,这是预期的。

return concat('"', 'bar') 计算结果为 ""bar.

怎么来的?我还以为有 no difference between single and double quotes in xquery.

这是我的脚本:

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

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

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

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

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

来自上面链接的 W3C 规范:

An instance of xs:string, xs:untypedAtomic or xs:anyURI is serialized by enclosing the value in double quotation marks and doubling any quotes within the value.

如果您希望看到没有任何此类引号转义的结果,您可以使用 eXide 查询输出窗格正上方的下拉菜单,然后使用 select "Text Method" 或 "XML Method" .

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

In 2.4.0, eXide jettisoned its longstanding “pretty-printing” library, now using eXist’s built-in serialization methods. This change means improved whitespace accuracy and speed when viewing your query results, and turns eXide into a serialization sandbox. By toggling the output methods via the “Output” dropdown menu, you can serialize query results not just as Adaptive, JSON, XML, or the old “direct” (rendered) method, but also as Text, HTML5, XHTML, XHTML5, and MicroXML. The new “Indent” checkbox lets you toggle whether query results are indented or not.

最后,我要指出,eXist 有自己的原生 XQuery 引擎,eXide 将查询直接传递给 eXist 执行,而不是传递给 Saxon。 eXist 仅将 Saxon 用于 XSLT——即,当您使用 transform module 从 XQuery 调用 XSLT 时。