2015-01-23 3 views
0

XQuery добавляет пробел, и я не понимаю, почему. У меня есть следующий простой запрос:Почему 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: Я добавил саксон как тег для вопроса, даже если вопрос не является специфическим для Саксона.

ответ

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

Ваше лучшее объяснение! Вы также можете удалить внутренний 'fn: concat'. – adamretter

+0

Да, выставляя явно '$ i' и' 100' для строки с 'xs: string' – lkuty

+5

Не совсем корректно. Если запрос вернул последовательность текстовых узлов, они будут объединены без пробелов. Но он возвращает последовательность атомных значений (более конкретно, строки), а атомные значения - разделяемое пространство вывода. Например, запрос (от 1 до 3) выводит «1 2 3», а не «123». –

1

Пространство между точками, в основном разделитель вводится между элементами в последовательности, сконструированный. Казалось бы, текстовый сериализатор Saxon, где он выводит на консоль, вставляет этот пробельный символ, чтобы вы могли понять элементы вывода.

Учитывая код:

declare option saxon:output "method=text"; 

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

Результат for $i in 1 to 10 return представляет собой последовательность из 10 хз: строковых элементов. Из вашего вывода вы можете определить, что пробел перемежается между каждой оценкой concat(".", $i, "	", 100, "
", ".").

Если вы хотите, чтобы убедиться, что вы можете переписать запрос как:

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

И вы увидите ваши 10 различных элементов без пробелов между ними.

Если вы пытаетесь создать единую текстовую строку, так как вы уже контролируете разрывы строк, то вы также можете объединить все элементы из 10 xs: string, что приведет к устранению пробелов вы видите между элементами последовательности. Например:

declare option saxon:output "method=text"; 

string-join(
    for $i in 1 to 10 
    return 
     (".", string($i), "&#x9;", "100", "&#xA;", ".") 
, "") 
Смежные вопросы