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)运行它:
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
.
我的问题来自于点之间存在额外的空间。第一行是好的,但是下面的行(2到10)有这个空间,我不明白为什么。我们所看到的数字之间的空格实际上是由字符引用插入的列表。
你能告诉我这种行为吗?
PS:我已经添加了撒克逊作为问题的标签,即使这个问题不是撒克逊人特有的。
答案 0 :(得分:2)
我认为你的查询返回一个字符串值序列,然后默认情况下用空格连接(参见http://www.w3.org/TR/xslt-xquery-serialization/#sequence-normalization,其中说“对于S2中相邻字符串的每个子序列,将一个字符串复制到新序列等于按顺序连接的子序列中的字符串的值,每个字符串由单个空格“)分隔。如果您不想这样,那么您可以使用
string-join(for $i in 1 to 10
return concat(".", $i, "	", 100, "
", "."), '')
答案 1 :(得分:1)
点之间的空间基本上是在您构建的序列中的项之间引入的分隔符。撒克逊的文本序列化器似乎输出到控制台,插入空格字符,以便您了解输出项。
考虑您的代码:
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:字符串项的序列。从您的输出中,您可以确定空间是散布在concat(".", $i, "	", 100, "
", ".")
的每个评估之间。
如果您想检查是否可以将查询重写为:
for $i in 1 to 10
return
<x>{concat(".", $i, "	", 100, "
", ".")}</x>
你会看到你的10个不同的项目之间没有空格。
如果您正在尝试创建单个文本字符串,因为您已经在控制换行符,那么您也可以自己将所有10个x:string项目连接在一起,这样可以消除空格在序列项之间看到。例如:
declare option saxon:output "method=text";
string-join(
for $i in 1 to 10
return
(".", string($i), "	", "100", "
", ".")
, "")