为什么XQuery会添加额外的空间?

为什么XQuery会添加额外的空间?,xquery,saxon,Xquery,Saxon,XQuery添加了一个空格,我不明白为什么。我有以下简单的疑问: declare option saxon:output "method=text"; for $i in 1 to 10 return concat(".", $i, "	", 100, "
", ".") 我用Saxon(SaxonEE9-5-1-8J和SaxonHE9-5-1-8J)运行它: 结果如下: .1 100 . .2 100 . .3 100 . .4 100

XQuery添加了一个空格,我不明白为什么。我有以下简单的疑问:

declare option saxon:output "method=text";

for $i in 1 to 10
return concat(".", $i, "	", 100, "
", ".")
我用Saxon(SaxonEE9-5-1-8J和SaxonHE9-5-1-8J)运行它:

结果如下:

.1  100
. .2    100
. .3    100
. .4    100
. .5    100
. .6    100
. .7    100
. .8    100
. .9    100
. .10   100
.
我的问题来自点与点之间是否存在额外的空间。第一行是可以的,但是下面的行(2到10)有这个空间,我不明白为什么。我们所看到的数字之间的空格实际上是由字符引用插入的表格

你能告诉我你的行为吗


PS:我已经添加了saxon作为问题的标记,即使问题不是特定于saxon的。

我认为您的查询返回一个字符串值序列,默认情况下,这些字符串值会与一个空格连接起来(请参见其中的内容)“对于S2中相邻字符串的每个子序列,将一个字符串复制到新序列中,该序列等于按顺序连接的子序列中字符串的值,每个值用一个空格分隔”)。如果不需要,可以使用

string-join(for $i in 1 to 10
return concat(".", $i, "	", 100, "
", "."), '')

点之间的空格基本上是在您正在构建的序列中的项目之间引入的分隔符。似乎Saxon的文本序列化程序在输出到控制台的地方插入了空格字符,以允许您理解输出项目

考虑到您的代码:

declare option saxon:output "method=text";

for $i in 1 to 10
return
    concat(".", $i, "	", 100, "
", ".")
在1到10个return中对$i执行
的结果是一个10个xs:string项的序列。从您的输出中,您可以确定
concat(“.”,$i,“	;”,100,“
;”,“,”)的每个求值之间都有空格。

如果要检查是否可以将查询重写为:

for $i in 1 to 10
return
    <x>{concat(".", $i, "&#x9;", 100, "&#xA;", ".")}</x>

您的解释更好!您也可以删除内部的
fn:concat
。是的,通过显式地将
$i
100
强制转换为字符串
xs:string
不太正确。如果查询返回一个文本节点序列,这些节点将被连接起来,没有空格。但它返回一个原子值序列(更具体地说,字符串)和原子值是以空格分隔的。例如,查询(1到3)输出“1 2 3”而不是“123”。@MichaelKay,感谢您的澄清,我已经更正了答案中的文本。
for $i in 1 to 10
return
    <x>{concat(".", $i, "&#x9;", 100, "&#xA;", ".")}</x>
declare option saxon:output "method=text";

string-join(
    for $i in 1 to 10
    return
        (".", string($i), "&#x9;", "100", "&#xA;", ".")
, "")