如果我将两个文档添加到 BaseX 数据库中,比如说normal.xml
and normal2.xml
,有没有办法单独引用每个文档?
我知道这个doc()
函数,但它查看文件系统的位置,而不是数据库本身。
例如,如果我使用 this: 进行查询doc("normal.xml")/name
,那么我将收到关于normal.xml
未找到的错误。
我也试过:basex:db("my-db-name")/doc("normal.xml")/name
并收到同样的错误。
有任何想法吗?
我最终在BaseX 邮件列表上询问,我收到的答案如下:
for $doc in collection('test-db')
where matches(document-uri($doc), 'example.xml')
return $doc
我还询问为什么没有直接的方法来引用想要在恒定时间内从中提取数据的文档,得到的答复是:
这是由于XQuery 数据模型。XQuery 在数据库/集合中没有正式的文件概念(如果我错了,Christian 可能会纠正我),因此 collection() 命令返回给定数据库的任何(文档-)节点序列。用户可以选择他想要处理的那些节点。
我们目前正在寻找更直观地导航集合的想法;类似于“collection('db/path-to/document.xml')”的东西应该仍然符合当前的 W3C 建议。由于后续的 document-uri() 通常运行良好,因此这在我们的优先级列表中并不太高。
不过感谢您的帮助。
以下查询可能会对您有所帮助:
for $doc in collection('your-db-name')
let $path := base-uri($doc)
where ends-with($path, 'normal.xml')
return $doc/name
假设您知道,该doc()
功能就是您所需要的。假设您已经创建并打开了一个名为“mydb”的数据库,如果您使用以下命令添加文档:
ADD TO your_name /some/path/on/filesystem.xml
您始终可以使用以下方法打开以下文档:
XQUERY doc('mydb/your_name')
ADD TO 将忽略您给它的文件名并使用您在 URI 中指定的名称。但请注意:运行该命令时,不能保证“your_name”的唯一性。如果它不是唯一的,(doc) 函数将抛出 BaseX 错误(不是 XQuery 标准的一部分),说它匹配多个文档。