使用XQuery参考BaseX DB中的特定文档

时间:2010-07-29 14:19:09

标签: xml xquery basex

如果我向BaseX数据库添加两个文档,比方说normal.xmlnormal2.xml,是否可以单独引用每个文档?

我知道doc()函数,但它查看文件系统的位置,而不是数据库本身。

例如,如果我使用doc("normal.xml")/name查询,那么我将收到有关normal.xml未找到的错误。

我也尝试过:basex:db("my-db-name")/doc("normal.xml")/name并收到同样的错误。

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

我最后询问BaseX mailing list,我收到的答案如下:

for $doc in collection('test-db')
    where matches(document-uri($doc), 'example.xml')
return $doc

我还询问为什么没有直接的方法来引用想要在恒定时间内提取数据的文档,响应是:

  

这是由于XQuery data model。 XQuery在数据库/集合中没有正式的文件概念(如果我错了,Christian可能会纠正我),   所以collection()命令返回给定数据库的任何(document-)节点序列。   用户可以选择他想要处理的节点。

     

我们目前正在寻找更直观地浏览馆藏的想法;类似的东西   “collection('db / path-to / document.xml')”仍应符合当前的W3C建议。   由于后续文档-uri()通常运行良好,因此我们的优先级列表不会太高。

感谢您的帮助。

答案 1 :(得分:6)

以下查询可能会对您有所帮助:

for $doc in collection('your-db-name')
let $path := base-uri($doc)
where ends-with($path, 'normal.xml')
return $doc/name

答案 2 :(得分:4)

假设您知道,doc()功能就是您所需要的。假设您已创建并打开名为“mydb”的数据库,如果使用以下命令添加文档:

ADD TO your_name /some/path/on/filesystem.xml

您始终可以使用以下方式打开以下文档:

XQUERY doc('mydb/your_name')

ADD TO将忽略您提供的文件名,并使用您在URI中指定的名称。但要注意:运行该命令时无法保证'your_name'的唯一性。如果它不是唯一的,那么(doc)函数将抛出一个BaseX错误(不是XQuery标准的一部分),说它匹配多个文档。