Интересно, есть ли способ поделиться фрагментами html-кода в eXist-db. У меня есть две разные (более ожидаемые позже) функции, возвращающие одну и ту же большую html-форму для разных результатов. Раздражает поддерживать один и тот же код, когда я что-то меняю в одном из них. Я пытался:
- Сохраните его как файл html и загрузите его с помощью функции
doc()
(eXist жалуется, что это не файл xml, а двоичный файл. - Сохранение его как глобальной переменной в отдельный модуль (eXist жалуется на проблему с контекстами). Я не знаю, как передать такую переменную без префикса пространства имен.
- Сохранение его как функции, возвращающей собственную огромную переменную (eXist жалуется на проблему с контекстами).
Какова наилучшая практика?
ОБНОВЛЕНИЕ
Что ж, я попытался поместить фрагмент в переменную внутри функции, загруженной как модуль. Для меня это кажется разумным. Однако я получил ошибку при попытке вернуть это:
err:XPDY0002 Undefined context sequence for 'child::snip:snippet' [at line 62, column 13, source: /db/apps/karolinum-apps/modules/app.xql]
In function:a pp:book-search(node(), map, xs:string?) [34:9:/db/apps/karolinum-apps/modules/app.xql]
Я называю это так:
declare function app:list-books($node as node(), $model as map(*)) {
for $resource in collection('/db/apps/karolinum-apps/data/mono')
let $author := $resource//tei:titleStmt/tei:author/text()
let $bookName := $resource//tei:titleStmt/tei:title/text()
let $bookUri := base-uri($resource)
let $imgPath := replace($bookUri, '[^/]*?$', '')
let $fileUri := ( '/exist/rest' || $bookUri )
let $fileName := replace($bookUri, '.*?/', '')
return
if ($resource//tei:titleStmt/tei:title)
then
snip:snippet
else ()
};
Есть идеи, пожалуйста?
ОБНОВЛЕНИЕ II
Здесь у меня есть функция в модуле:
module namespace snip = "http://46.28.111.241:8081/exist/db/apps/karolinum-apps/modules/snip";
declare function snip:snippet($node as node(), $model as map(*), $author as xs:string, $bookTitle as xs:string, $bookUri as xs:anyURI, $fileUri as xs:anyURI) as element()* {
let $snippet :=
(
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><a href="{$fileUri}">{$bookTitle}</a> ({$author})</h3>
</div>
<div class="panel-body">
...
</div>
)
return $snippet
};
Вот пытаюсь назвать:
declare function app:list-books($node as node(), $model as map(*)) {
for $resource in collection('/db/apps/karolinum-apps/data/mono')
let $author := $resource//tei:titleStmt/tei:author/text()
let $bookTitle := $resource//tei:titleStmt/tei:title/text()
let $bookUri := base-uri($resource)
let $fileUri := ('/exist/rest' || $bookUri)
let $fileName := replace($bookUri, '.*?/', '')
where not(util:is-binary-doc($bookUri))
order by $bookTitle, $author
return
snip:snippet($author, $bookTitle, $bookUri, $fileUri)
};
Он бросает:
err:XPST0017 error found while loading module app: Error while loading module app.xql: Function snip:snippet() is not defined in namespace 'http://46.28.111.241:8081/exist/db/apps/karolinum-apps/modules/snip' [at line 35, column 9]
Когда я пытался поместить сниппет в переменную, то не получалось передать туда те используемые локальные переменные (выбрасывало $fileUri is not set
). Кроме того, я пытался изменить возвращаемый тип element()*
, но ничего не помогло.