eXist DB和Xquery:xincludes或collections(TEI-XML)?

时间:2018-06-27 11:22:54

标签: xslt xquery exist-db tei

我在TEI-XML中有一个语料库,它使用“主”语料库XML文档,然后通过xi:include包含成千上万个其他文档。每个文档本身都包含xml:id来控制命名实体(通过xi:includes链接的人,地点等)的主列表。所有这些在XSLT(以及在我的IDE Oxygen中进行快速编码)中都非常有效。

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

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

非常感谢。

2 个答案:

答案 0 :(得分:1)

正确的,eXist的XInclude实现专注于输出(即序列化),而不是查询或索引。正如eXist's documentation page on XInclude所述:

  

XInclude处理器被实现为串行器的输出事件流和接收器之间的过滤器...因此,只要eXist-db序列化XML片段(无论是文档,XQuery的结果还是XML片段),都将应用XInclude处理。 XSLT样式表。

因此,如果您使用XInclude来汇编您的语料库,并且想要查询/遍历该语料库,则可以这样进行:(1)编写查询以读取您的XInclude,然后像查询地图一样跟踪它以查找组件文档, (2)将您的数据预先序列化为新文档,然后直接查询生成的文档,或者(3)将文档放入便于您执行各种查询的集合中。

答案 1 :(得分:1)

根据那数千个文档的大小,运行xqueries时遍历xinclude往往很慢,而且占用大量内存。以我的经验,乔的选择3通常是可行的方法。

与直接使用xslt不同,在exist-db中,您可以定义索引。例如。您有一个<listPerson>元素作为1000多个xincludes的包装,这些元素将<person>元素作为自己文档的根。

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

对于验证,您将需要确定是否真的总是需要对整个扩展文档进行完整的验证。这需要一些摆弄,但是在没有看到实际文件和代码的情况下,我没有太多常规建议。

您可以找到有关在现有in the documentation中建立索引的更多信息