MarkLogic:XQuery从XML文档中获取值?
我在MarkLogic数据库中加载了以下XML文档:MarkLogic:XQuery从XML文档中获取值?,xml,xsd,xquery,marklogic,xquery-sql,Xml,Xsd,Xquery,Marklogic,Xquery Sql,我在MarkLogic数据库中加载了以下XML文档: <x:books xmlns:x="urn:books"> <book id="bk001"> <author>Writer</author> <title>The First Book</title> <genre>Fiction</genre> <price>44.95</price>
<x:books xmlns:x="urn:books">
<book id="bk001">
<author>Writer</author>
<title>The First Book</title>
<genre>Fiction</genre>
<price>44.95</price>
<pub_date>2000-10-01</pub_date>
<review>An amazing story of nothing.</review>
</book>
<book id="bk002">
<author>Poet</author>
<title>The Poet's First Poem</title>
<genre>Poem</genre>
<price>24.95</price>
<review>Least poetic poems.</review>
</book>
</x:books>
注意:不需要管道分隔,但需要一些集合列表
有人能分享一些链接或者帮我写这个XQuery吗?我不熟悉这一点。XQuery的序列结构将包含多个值,但它不是层次结构的-因此,如果创建序列序列,它将简单地将它们全部连接到一个大序列中 这将把所有子元素和属性值捕获到一个序列中,但是由于我刚才提到的序列的属性,没有内置的方法来获取第二本书的第一个值。你必须知道这是第七项。第三本书的第一个价值是第14项,依此类推:
$books/book/(*|@*)/string()
仅演示如何实现管道分隔列表:
string-join($books/book[1]/(*|@*)/node-name() ! string(), ' | '), (: Create header row :)
for $book in $books/book
return string-join($book/(*|@*)/string(), ' | ')
@wst:非常感谢。出于某种原因,我无法在marklogic中运行相同的程序。可能它适用于通用XMLXQuery。但我找到了以下解决方案
for $x at $i in doc("bookstore.xml")/bookstore/book
return data($x)
请找到我的答案。但是我得到了一行的值,不知道我能不能把它连接起来。我无法理解字符串连接是如何工作的。你能帮我修改代码来解决这个问题吗?你的问题没有说明你是如何选择那个XML示例的,所以我只是用
$books
作为占位符。您需要更新它以反映它在数据库中的存储方式。从您的评论中,我也不清楚join是什么意思。@wst的答案在MarkLogic中有效,前提是$books设置正确。具体来说,它应该类似于declare变量$books:=fn:doc(“bookstore.xml”)/bookstore
注意,不同的项目(书籍)通常应该在不同的文档中。如果您有一个带有books根目录的文档,并且其下有很多book元素,那么搜索和索引功能将无法正常工作。这将是一本有用的书。
for $x at $i in doc("bookstore.xml")/bookstore/book
return data($x)