2013-07-13 5 views
0

У меня есть набор файлов, описывающих содержание журналовXQuery - CONCAT с таким же первым значением

<magazine> 
<issue.number>22</issue.number> 
<article> 
<title>first article</title> 
<subject>James</James> 
</article> 
<article> 
<title>second article</title> 
<subject>James</subject> 
</article> 
</magazine> 

Я хочу, чтобы вывести список статей в формате <issue.number>, <title>.

Так что я создал XQuery:

for $x in /magazine 
return concat($x/issue.number/text(),',',$x//title/text()) 

Это приводит к ошибке, о которой я думаю, что это вызвано тем, что значение <issue.number> возвращается в два раза. В Exist DB я получаю это:

Фактическая мощность для параметра 1 не соответствует мощность, объявленной в подписи функция в: CONCAT ($ atomizable-ценности как XDT: anyAtomicType ?, ...) хз: строки? , Ожидаемая мощность: ноль или одна, получена 2.

Так что, если я не могу использовать concat(), что я могу использовать?

+0

Пожалуйста, посмотрите на предварительный просмотр перед публикацией, HTML элементы должны быть экранированы, как код, чтобы распечатать. Я также исправил незначительные ошибки синтаксиса ('For' и отсутствующее имя переменной), пожалуйста, не забудьте скопировать код вставки, а не вводить его снова, чтобы предотвратить такие ошибки. –

+1

Спасибо за то, что Дженс, я видел ваше редактирование и посетил вашу страницу профиля, но не видел сообщения или «спасибо». Я ценю это. – Jack

ответ

2

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

На этот раз петля над журналами, а затем снова над изделиями. Было бы также хорошо, если бы только петли над статьями, но тогда вам придется использовать родительскую ось, которую я предпочитаю избегать.

for $magazine in $xml/magazine 
for $article in $magazine/article 
return concat($magazine/issue.number, ',', $article//title) 

22, первая статья
22, вторая статья


Для конкатенации над последовательностями строк, посмотрите на string-join($sequence, $seperator). Например, если вы хотите, чтобы все заголовки одной проблемы подряд.

for $magazine in $xml/magazine 
return concat($magazine/issue.number, ': ', string-join($magazine//title, ', ')) 

, который будет возвращать

22: первая статья, вторая статья

+0

Спасибо, что это Йенс. – Jack

Смежные вопросы