为什么 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, "	", 100, "
", ".")}</x>
您会看到 10 个不同的项目,中间没有 spaces。
如果您尝试创建单个文本字符串,因为您已经控制了换行符,那么您也可以自己将所有 10 个 xs:string 项目连接在一起,这将产生以下效果消除您在序列项之间看到的 spaces。例如:
declare option saxon:output "method=text";
string-join(
for $i in 1 to 10
return
(".", string($i), "	", "100", "
", ".")
, "")
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, "	", 100, "
", ".")}</x>
您会看到 10 个不同的项目,中间没有 spaces。
如果您尝试创建单个文本字符串,因为您已经控制了换行符,那么您也可以自己将所有 10 个 xs:string 项目连接在一起,这将产生以下效果消除您在序列项之间看到的 spaces。例如:
declare option saxon:output "method=text";
string-join(
for $i in 1 to 10
return
(".", string($i), "	", "100", "
", ".")
, "")