如何将XQuery结果存储为BaseX

时间:2016-01-15 18:50:01

标签: java xquery basex xquery-3.0 xquery-update

非常新的XML文档数据库技术,Xquery / Xpath等。所以这可能是一个非常新手的问题。

场景:许多XML文档作为输入,想要运行一些转换,可以在这些XML文档上运行(使用XQuery)。我想存储这些结果。与输入相同的XML数据存储。

到目前为止,我正在尝试使用BaseX文档数据库来存储和处理这些XML文档,到目前为止它很容易使用,我印象深刻。

理想情况下,我想使用XQJ API(http://xqj.net/basex/)与BaseX进行交互,因为我的理由是XQJ会保持应用程序代码的实现独立于BaseX。辅助选项会将我的java代码直接写入BaseX API。

问题:我很难弄清楚如何将XQuery的结果存储为新的"文档"在数据库中。也许这比使用XX(或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吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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;