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
。
怎么了?我以为有no difference between single and double quotes in xquery。
这是我的剧本:
xquery version "3.1";
let $c := concat('"','car')
return $c
答案 0 :(得分:2)
默认情况下,eXide使用标准adaptive output method序列化查询结果。由于concat()
函数返回字符串,因此自适应输出会将字符串包装在双引号中,并通过将字符串加倍来对字符串中的任何双引号进行转义。这解释了您所看到的现象。
根据上面链接的W3C规范:
xs:string
,xs:untypedAtomic
或xs:anyURI
的实例通过将值用双引号引起来并将该值内的所有引号加倍而被序列化。
如果您希望在不使用任何引号转义的情况下查看结果,则可以使用eXide查询输出窗格上方的下拉菜单,然后选择“文本方法”或“ XML方法”。
eXide的documentation(可通过“帮助”>“文档”查看)说明了其序列化功能和默认设置,如下所示:
在2.4.0中,eXide放弃了其长期使用的“漂亮打印”库,现在使用eXist的内置序列化方法。此更改意味着查看查询结果时提高了空格的准确性和速度,并将eXide变成了序列化沙箱。通过“输出”下拉菜单切换输出方法,您不仅可以将查询结果序列化为Adaptive,JSON,XML或旧的“直接”(呈现)方法,还可以序列化为Text,HTML5,XHTML,XHTML5和MicroXML。新的“缩进”复选框可让您切换是否对查询结果进行缩进。
最后,我应该注意到eXist有自己的本机XQuery引擎,并且eXide将查询直接传递给eXist来执行,而不是传递给Saxon。 eXist仅将Saxon用于XSLT,即,当您使用transform
module从XQuery调用XSLT时。
答案 1 :(得分:0)
普遍而言并非如此。使用引号或字符串边界评估XQuery的方式没有什么不同。但是,带引号的字符串表达式中的字符将按字面值求值。在您的示例中,您必须在字符串内使用另一个引号字符,因为否则它不会解析("""
或'''
)。但是,通过转义与用来绑定字符串表达式的引号匹配的引号,您仍然可以使用所需的任何文字引号字符。您可以通过连续使用其中两个来做到这一点:
concat('''', 'bar'), concat("""", 'bar')
=>
'bar
"bar
为了提高可读性,您还可以使用相应的实体,"e
的{{1}}和"
的{{1}}。这些规范在此处的规范中说明:https://www.w3.org/TR/xquery-30/#doc-xquery30-EscapeQuot