2

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

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

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

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

问题:我很难弄清楚如何将来自 XQuery 的结果作为新的“文档”存储在数据库中。也许这更多的是对 XQuery(或 XQuery 更新)本身的概念缺乏理解,而不是对 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>orINSERT INTO等​​。但我不清楚 XQuery 中的等价物是什么。我认为 XQuery 更新功能是我在这里需要的,但我很难找到具体的例子。

这在处理 XQJ 时更加复杂

XQResultSequence rs = xqe.executeQuery("//firstName");
// what do i do with it now??

有没有办法使用 BaseX 将此 XQResultSequence 持久化回数据库?或者更好的是,我可以直接在 XQResultSequence 上运行其他 XQueries 吗?

谢谢您的帮助!

4

1 回答 1

2

BaseX 实现了XQuery 更新工具,因此您应该能够使用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;
于 2016-01-15T19:30:03.103 回答