我有一系列描述杂志内容的文件
<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()
我可以使用什么?
答案 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:第一篇文章,第二篇文章