我在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最佳实践的指南。
非常感谢。
答案 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中建立索引的更多信息