eXist DB 和 Xquery:xincludes 还是集合 (TEI-XML)?
eXist DB and Xquery : xincludes or collections (TEI-XML)?
我在 TEI-XML 中有一个语料库,它使用 'master' 语料库 XML 文档,然后通过 xi:include
包含数千个其他文档。这些文档中的每一个本身都包含 xi:include
s 以掌握命名实体列表(人、地点等由 xml:id
s 链接)。所有这些在 XSLT 中(以及在我的 IDE Oxygen 中用于快速编码)都非常有效。
我现在正着手使用 eXist-DB 应用程序构建网站。我正在直接在 Xquery 中重写所有内容(以替换 XSLT),并且我做出了一个意想不到的决定。我习惯用xi:includes
遍历语料库和各种XMLs文件。但是阅读 eXist DB 的文档,似乎鼓励的做法是使用集合并直接查询它们,而不是通过 xi:include
s 导航。似乎 eXist-DB 也不支持 xi:includes
的完整实现,需要一些变通方法?
我正在寻找有关 eXist-DB/Xquery 在此上下文中的最佳实践的指导。
非常感谢。
正确,eXist 的 XInclude 实现专注于输出(即序列化)而不是查询或索引。正如 eXist's documentation page on XInclude 所述:
The XInclude processor is implemented as a filter in between the serializer's output event stream and the receiver... XInclude processing is therefore applied whenever eXist-db serializes an XML fragment, whether it's a document, the result of an XQuery or an XSLT stylesheet.
因此,如果您使用 XInclude 来 assemble 您的语料库并且您想要 query/traverse 这个语料库,您可以通过 (1) 编写查询来读取您的 XInclude 并像这样跟踪它用于查找组件文档的映射,(2) 将数据预序列化为新文档,然后直接查询生成的文档,或 (3) 将文档放入集合中,以方便您进行各种查询。
根据那数千个文档的大小,在 运行ning xqueries 时遍历 xinclude 往往很慢并且占用大量内存。根据我的经验,Joe 的选项 3 通常是可行的方法。
与直接的 xslt 不同,在 exist-db 中您可以定义索引。例如。你有一个 <listPerson>
元素作为 1000s xincludes 的包装,将 <person>
元素作为他们自己文档的根。
如果您已经为 <person>
定义和索引,您可以使用例如ft:query()
直接查询索引,而不管元素位于子集合和文档树中的哪个位置。与从 master 开始遍历整个文档并解析 xincludes 相比,这往往要快几个数量级。
至于验证,您将需要决定是否真的总是需要对整个扩展文档进行全面验证 运行。这需要一些小技巧,但在没有看到实际文件和代码的情况下,我无法提供太多一般性建议。
您可以在 exist in the documentation
中找到有关索引的更多信息
我在 TEI-XML 中有一个语料库,它使用 'master' 语料库 XML 文档,然后通过 xi:include
包含数千个其他文档。这些文档中的每一个本身都包含 xi:include
s 以掌握命名实体列表(人、地点等由 xml:id
s 链接)。所有这些在 XSLT 中(以及在我的 IDE Oxygen 中用于快速编码)都非常有效。
我现在正着手使用 eXist-DB 应用程序构建网站。我正在直接在 Xquery 中重写所有内容(以替换 XSLT),并且我做出了一个意想不到的决定。我习惯用xi:includes
遍历语料库和各种XMLs文件。但是阅读 eXist DB 的文档,似乎鼓励的做法是使用集合并直接查询它们,而不是通过 xi:include
s 导航。似乎 eXist-DB 也不支持 xi:includes
的完整实现,需要一些变通方法?
我正在寻找有关 eXist-DB/Xquery 在此上下文中的最佳实践的指导。
非常感谢。
正确,eXist 的 XInclude 实现专注于输出(即序列化)而不是查询或索引。正如 eXist's documentation page on XInclude 所述:
The XInclude processor is implemented as a filter in between the serializer's output event stream and the receiver... XInclude processing is therefore applied whenever eXist-db serializes an XML fragment, whether it's a document, the result of an XQuery or an XSLT stylesheet.
因此,如果您使用 XInclude 来 assemble 您的语料库并且您想要 query/traverse 这个语料库,您可以通过 (1) 编写查询来读取您的 XInclude 并像这样跟踪它用于查找组件文档的映射,(2) 将数据预序列化为新文档,然后直接查询生成的文档,或 (3) 将文档放入集合中,以方便您进行各种查询。
根据那数千个文档的大小,在 运行ning xqueries 时遍历 xinclude 往往很慢并且占用大量内存。根据我的经验,Joe 的选项 3 通常是可行的方法。
与直接的 xslt 不同,在 exist-db 中您可以定义索引。例如。你有一个 <listPerson>
元素作为 1000s xincludes 的包装,将 <person>
元素作为他们自己文档的根。
如果您已经为 <person>
定义和索引,您可以使用例如ft:query()
直接查询索引,而不管元素位于子集合和文档树中的哪个位置。与从 master 开始遍历整个文档并解析 xincludes 相比,这往往要快几个数量级。
至于验证,您将需要决定是否真的总是需要对整个扩展文档进行全面验证 运行。这需要一些小技巧,但在没有看到实际文件和代码的情况下,我无法提供太多一般性建议。
您可以在 exist in the documentation
中找到有关索引的更多信息