eXist DB и Xquery: xinclude или коллекции (TEI-XML)? - PullRequest
0 голосов
/ 27 июня 2018

У меня есть корпус в TEI-XML, который использует «основной» корпус XML-документа, который затем, через xi:include, содержит тысячи других документов. Каждый из этих документов содержит xi:include s для создания списков именованных объектов (людей, мест и т. Д., Связанных xml:id s). Все это очень хорошо работает в XSLT (и в моем IDE Oxygen для быстрого кодирования).

Сейчас я приступаю к созданию сайта с использованием приложений eXist-DB. Я переписываю все прямо в Xquery (чтобы заменить XSLT), и я неожиданно принял решение. Я привык использовать xi:includes для обхода корпуса и различных файлов XML. Но, читая документацию по eXist DB, кажется, что рекомендуется использовать коллекции и запрашивать их напрямую, а не перемещаться по xi:include s. Также кажется, что eXist-DB не поддерживает полную реализацию xi:includes в любом случае и требует некоторого обходного решения?

Я ищу рекомендации относительно лучших практик eXist-DB / Xquery в этом контексте.

Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

В зависимости от размера этих тысяч документов обход xinclude при запуске xqueries может быть медленным и занимать достаточно много памяти. По моему опыту, вариант 3 Джо - обычно путь.

В отличие от обычного xslt, в exist-db вы можете определять индексы. Например. у вас есть элемент <listPerson> в качестве оболочки для 1000-х годов, включая <person> элементы в качестве корня их собственного документа.

Если вы определили и индекс для <person>, вы можете использовать, например, ft:query() для непосредственного запроса к индексу, независимо от того, где в дереве вложенных коллекций и документов расположен элемент. Это, как правило, на несколько порядков быстрее по сравнению с обходом всего документа, начиная с мастера и решая xinclude.

Что касается проверки, вам нужно будет решить, действительно ли необходим полный цикл проверки всего расширенного документа. Это требует некоторых хлопот, но я не могу дать много общих советов, не видя реальных файлов и кода.

Более подробную информацию об индексации вы можете найти в документации в документации

0 голосов
/ 29 июня 2018

Правильно, реализация XInclude eXist ориентирована на вывод (т. Е. На сериализацию), а не на запросы или индексирование. На странице документации eXist в XInclude говорится:

Процессор XInclude реализован как фильтр между потоком выходных событий сериализатора и получателем ... Поэтому обработка XInclude применяется всякий раз, когда eXist-db сериализует фрагмент XML, будь то документ, результат XQuery или Таблица стилей XSLT.

Таким образом, если вы используете XInclude для сборки своего корпуса и хотите запросить / просмотреть этот корпус, вы можете сделать это, (1) написав запрос для чтения вашего XInclude и следуя ему, как карте, чтобы найти документы компонента, (2) предварительно сериализовав ваши данные в новый документ, а затем запросив итоговый документ напрямую, или (3) поместив документы в коллекции, которые облегчают типы запросов, которые вы хотите выполнить.

...