1

我有一个 TEI-XML 语料库,它使用一个“主”语料库 XML 文档,然后包含xi:include数千个其他文档。这些文档中的每一个本身都包含xi:includes 以掌握命名实体(由xml:ids 链接的人、地点等)的列表。所有这些都在 XSLT 中运行良好(在我的 IDE Oxygen 中用于快速编码)。

我现在正在着手使用 eXist-DB 应用程序构建一个网站。我正在直接在 Xquery 中重写所有内容(以替换 XSLT),但我遇到了一个意想不到的决定。我习惯于xi:includes遍历语料库和各种 XMLs 文件。但是阅读 eXist DB 的文档,似乎鼓励的做法是使用集合并直接查询它们,而不是通过xi:includes 导航。似乎 eXist-DB 不支持xi:includes无论如何的完整实现并且需要一些解决方法?

我正在寻找有关 eXist-DB/Xquery 在这种情况下的最佳实践的指导。

提前谢谢了。

4

2 回答 2

1

根据这数千个文档的大小,在运行 xqueries 时遍历 xinclude 往往会很慢并且占用大量内存。以我的经验,乔的选择 3 通常是要走的路。

与直接 xslt 不同,在存在数据库中您可以定义索引。例如,您有一个<listPerson>元素作为 1000s xincludes 的包装器,将<person>元素作为它们自己文档的根。

如果您已经定义和索引,<person>则可以使用例如ft:query()直接查询索引,而不管该元素位于子集合和文档树中的什么位置。与从 master 开始遍历整个文档并解析 xincludes 相比,这往往要快几个数量级。

至于验证,您需要确定是否真的需要对整个扩展文档进行完整验证。这需要一些摆弄,但在没有查看实际文件和代码的情况下,我无法提供太多一般性建议。

您可以在文档中找到有关索引的更多信息

于 2018-06-29T10:55:17.183 回答
1

正确,eXist 的 XInclude 实现侧重于输出(即序列化)而不是查询或索引。正如eXist 在 XInclude 上的文档页面所述:

XInclude 处理器被实现为序列化程序的输出事件流和接收器之间的过滤器......因此,每当 eXist-db 序列化 XML 片段时应用 XInclude 处理,无论它是文档、XQuery 的结果还是 XSLT 样式表。

因此,如果您使用 XInclude 来组装您的语料库并且您想要查询/遍历这个语料库,您可以通过以下方式来做到这一点:(1)编写一个查询来读取您的 XInclude 并像地图一样跟随它来查找组件文档,(2)将您的数据预序列化到一个新文档中,然后直接查询生成的文档,或者 (3) 将文档放入集合中,以便于您想要执行的查询类型。

于 2018-06-29T09:48:18.867 回答