2015-09-03 3 views
1

Возможно ли использовать xi: include для импорта результатов внешнего документа xquery или для вызова xquery из XML-документа? Я знаю, что на самом деле это не обязательно, но у меня есть ситуация, когда серия xml-документов была создана и оформлена с использованием xslt. Я хотел бы захватить небольшое подмножество из xml-документов (одна строка из нескольких версий стихотворения) и отобразить его внизу страницы. Мой xquery работает, но я пытаюсь понять, как лучше всего справиться с следующим шагом.Импорт результатов XQuery в XML-документ с использованием xi: include

Это XQuery:

let $q:=collection('file:/users/matt/Documents/tei/Lydgate/Quis_Dabit?select=*.xml') 

for $y in $q//tei:surface 

let $g := concat(substring($y/tei:graphic/@url,1,string-length($y/tei:graphic/@url)-4), '.html') 
let $z := $y/tei:zone[@n="EETS.QD.4"] 
let $l := $z/tei:line[@n="l.1"] 
let $o := $l/tei:orig/node() 
where ($z//tei:line/@n = "l.1") 


return <item><ref target="{$g}">{$o}</ref></item> 

`захватывает все XML-документы и формирует этот результат:

<item> 
    <ref target="British_Library_Harley_2255_f67r.html"> 
     <hi xmlns="http://www.tei-c.org/ns/1.0" rend="blue_pilcrow">¶</hi>O alle ye douħtren of <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">ierusaleem</hi> 
    </ref> 
</item> 
<item> 
    <ref target="Jesus_Q_G_8_f20r.html"> 
     <hi xmlns="http://www.tei-c.org/ns/1.0">A</hi>ll the <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">doughtren </hi>of <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">Ier</hi> 
     <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">usa</hi> 
     <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">l</hi> 
     <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">e</hi> 
     <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">m</hi> .</ref> 
</item> 
<item> 
    <ref target="Laud_683_f78v.html">O alle ẏe douhtren of jerusaleem</ref> 
</item> 

Потому что у меня есть структура Xsl там, я хочу, чтобы стиль его с теми же Xsl листов Я делаю статические xml-страницы. Что означает, что я хотел бы быть в состоянии сделать что-то вроде этого:

<TEI xmlns="http://www.tei-c.org/ns/1.0" version="5.0" xmlns:xi="http://www.w3.org/2001/XInclude"> 
<teiHeader> 
    <fileDesc> 
     <titleStmt> 
      <title/> 
     </titleStmt> 
     <publicationStmt> 
      <p/>> 
     </publicationStmt> 
     <sourceDesc> 
      <p/> 
     </sourceDesc> 
    </fileDesc> 
</teiHeader> 
<text> 
    <body> 
     <list> 
      <xi:include href="test.xq"/> 
     </list> 
    </body> 
</text> 

с моей XSL таблицы стилей декларации в верхней части. Я знаю, что это возможно, если я поместил все в базу данных eXist, но я бы предпочел не добавлять всю платформу только ради этого поиска, если я могу помочь. Кроме того, если я буду лаять совершенно неправильное дерево, я был бы признателен, если бы кто-то мог сообщить мне об этом.

ответ

2

Начнем с начала: Сам XML ничего не знает, поэтому, чтобы ответить на ваш первый вопрос, можете ли вы включить (и выполнить, я полагаю!) Запрос XQuery, просто ссылаясь на него в XML, невозможно.

Обходной существует, но не является тривиальным:

  • Создания внешнего разобранной сущности
  • Регистра с XML читатель EntityReader (имена могут варьироваться в зависимости от платформы)
  • Этого читатель обрабатывает объект , то есть он запускает XQuery
  • Он возвращает результат этого XQuery, который затем может отображаться.

Этот подход будет означать, что ваш XML может отображаться только правильно, если он считывается с помощью EntityReader (вы можете даже отказаться от считывающих лиц и просто использовать зарегистрировать XInclude URIResolver, можете быть проще, но эффект является одна и та же).

Если вам необходимо просто включить скрипт XQuery , но не выполнить его, у вас уже есть правильное разрешение, поэтому я предполагаю, что это не то, что вам нужно.

Поскольку вы упоминаете, что вы разбираете свои документы с помощью XSLT, существует другое решение, предполагая, что XML, который вы показываете выше, был сгенерирован XSLT. В XSLT 3.0, you can import a package from XQuery. Это (очень) новая функция, и я уверен, что мы ее еще не поддерживаем в Exselt (и мы не планируем это в ближайшем будущем), но Saxon может.

Но если вы пойдете так, вы можете переписать свой XQuery как XSLT (если ваша инфраструктура разрешает это), и у вас будет более простая стратегия реализации.

Последняя мысль: если ваш XQuery статичен, то есть, если он всегда возвращает то же самое, не нужно включать XQuery. Если, однако, ваше требование состоит в том, чтобы сделать ваш XML динамичным, EntityReader или URIResolver - это способы выхода, но по сути, сам XML не должен быть динамическим, но он может быть вкладом в следующий процесс.

+0

Стрелять, я боялся этого. Я могу сгенерировать все xml в xquery и использовать php для применения таблицы стилей, я думаю. Благодаря! – medievalmatt

+0

Абель дает вам различные технические способы достижения желаемого. В более общем плане вам необходимо настроить «конвейер обработки». Обычно с XML вы хотите, чтобы контент проходил через разные этапы, на разных этапах, причем один из них был инъекцией результата оценки XQuery. Последнее: вероятно, больше, чем внешний анализируемый объект или элемент XInclude, вероятно, это были инструкции для обработки. В любом случае, это должно быть совместное решение между дизайном вашего XML и тем, как он обрабатывается вашей платформой/системой. –

+0

@medievalmatt, выше, florent дает хорошее объяснение конвейера обработки, который, если у вас есть возможность создать его (проверьте [XML-трубопровод] (https://en.wikipedia.org/wiki/XML_pipeline) и [XML Pipeline Definition Language Version 1.0] (http://www.w3.org/TR/xml-pipeline/)) - хороший способ. – Abel