我对XML文档数据库技术,Xquery/Xpath等非常陌生。所以这可能是一个非常新手的问题。
场景:一些XML文档作为输入,想要运行一定数量的转换可以在这些XML文档上运行(使用XQuery)。我想存储这些结果。放入与输入相同的 XML 数据存储中。
到目前为止,我正在尝试使用 BaseX 文档数据库来存储和处理这些 XML 文档,到目前为止,它非常易于使用,给我留下了深刻的印象。
理想情况下,我想使用 XQJ API (http://xqj.net/basex/) 与 BaseX 交互,因为我的理由是 XQJ 将尽可能保持应用程序代码的实现独立于 BaseX。第二个选项是将我的java代码直接写入BaseX API。
问题:我很难弄清楚如何将来自 XQuery 的结果作为新"文档"存储在数据库中。也许这更多的是对XQuery(或XQuery Update)本身的概念性缺乏理解,而不是对BaseX/XQJ API的任何困难。
在这个简单的示例中,如果我有这样的查询,它会以我想要的格式返回一些 XML 输出,用于我的新文档
let $items := //firstName
return <results>
{ for $item in $items
return <result> {$item} </result>
}
</results>
给
<results>
<result>
<firstName>Bob</firstName>
</result>
<result>
<firstName>Joe</firstName>
</result>
<result>
<firstName>Tom</firstName>
</result>
</results>
我想将此新<result>
文档存储回数据库中,以便在以后的查询/转换/等中使用。在SQL中,这对我来说是有意义的。我会做CREATE TABLE <name> SELECT <query>
或INSERT INTO
等。但我不清楚 XQuery 中的等价物是什么。我认为XQuery Update功能是我在这里需要的,但是我很难找到具体的例子。
在处理 XQJ 时,这更加复杂
XQResultSequence rs = xqe.executeQuery("//firstName");
// what do i do with it now??
有没有办法使用 BaseX 将此 XQResultSequence 持久化回数据库中?或者更好的是,我可以直接在XQResultSequence上运行额外的XQueries吗?
感谢您的帮助!
BaseX 实现了 XQuery Update Facility,因此您应该能够使用 fn:put
:
let $items := //firstName
return fn:put(
<results>{
for $item in $items
return <result> {$item} </result>
}</results>,
"/results/result-new.xml")
如果您正在运行像上面这样的简单即席查询,它应该相当简单。我对 XQJ 不是很熟悉,但如果你想按顺序运行查询,我怀疑有一种方法可以将这些XQResultSequence
变量传递回新查询,您可能会通过在以下查询中将变量声明为外部来接受它:
declare variable $previous-result as item()* external;