XQuery - 以相同的第一个值连接

时间:2013-07-13 21:03:50

标签: concatenation 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-values as xdt:anyAtomicType?,...)xs:string?。预期基数:零或一,得到2.

所以,如果我不能使用concat()我可以使用什么?

1 个答案:

答案 0 :(得分: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:第一篇文章,第二篇文章