为什么 XQuery 会额外添加一个 space?

Why does XQuery add an extra space?

XQuery 添加了一个 space,我不明白为什么。我有以下简单查询:

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):

java net.sf.saxon.Query -q:query.xq -o:result.txt

结果如下:

.1  100
. .2    100
. .3    100
. .4    100
. .5    100
. .6    100
. .7    100
. .8    100
. .9    100
. .10   100
.

我的问题来自点之间存在额外的 space。第一行没问题,但后面的行(2 到 10)有 space,我不明白为什么。我们在数字之间看到的 spaces 实际上是字符引用插入的表格。

你能告诉我这种行为吗?

PS:我添加了撒克逊语作为问题的标签,即使这个问题不是特定于撒克逊语的。

我认为您的查询 returns 一系列字符串值,然后默认情况下与 space 连接(请参阅 http://www.w3.org/TR/xslt-xquery-serialization/#sequence-normalization,其中显示 "For each subsequence of adjacent strings in S2, copy a single string to the new sequence equal to the values of the strings in the subsequence concatenated in order, each separated by a single space")。如果你不想那样,你可以使用

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

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

考虑您的代码:

declare option saxon:output "method=text";

for $i in 1 to 10
return
    concat(".", $i, "	", 100, "
", ".")

for $i in 1 to 10 return 的结果是一个包含 10 个 xs:string 项的序列。从您的输出中,您可以确定 space 散布在 concat(".", $i, "	", 100, "
", ".").

的每个评估之间

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

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

您会看到 10 个不同的项目,中间没有 spaces。

如果您尝试创建单个文本字符串,因为您已经控制了换行符,那么您也可以自己将所有 10 个 xs:string 项目连接在一起,这将产生以下效果消除您在序列项之间看到的 spaces。例如:

declare option saxon:output "method=text";

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