#uri #xquery #exist-db
Вопрос:
У меня возникли проблемы с отображением разных файлов данных с помощью одного HTML и предоставлением им отдельных URI. У меня есть 3 текстовых файла с данными: file1.xml,file2.xml и file3.xml.
У меня есть letter.html и я хочу иметь уникальный URI для каждого файла.
например:
…/exist/apps/Tobi-oshki/templates/file1.xml
или
…/exist/apps/Tobi-oshki/templates/file2.xml
Я хочу отобразить эти файлы с помощью одного HTML-файла, который называется letter.html. вот letter.html
<html xmlns="http://www.w3.org/1999/xhtml">
<div data-template="templates:surround" data-template-with="templates/page.html" data-template-at="content">
<meta charset="utf-8"/>
</div>
<html>
<body id="body">
<div style="width: 20%; height: 90px; float: left; margin:10px">
<h4>description:</h4>
<div data-template="letter:review"/>
</div>
<div style="width: 27%; height: 90px; float: left; margin:5px">
<h4>translation:</h4>
<div data-template="letter:text_orig"/>
</div>
<div style="width: 27%; height: 90px; float: left; margin:5px">
<h4>original text:</h4>
<div data-template="letter:text_trans"/>
</div>
<div style="width: 15%; height: 80px; float: left; margin:10px">
<h4>comments:</h4>
<div data-template="letter:notes"/>
</div>
Вот это index.html где у меня есть ссылки на плагины, поэтому, когда вы нажимаете
«буква: 001» он должен перейти к этой букве с этим идентификатором и отобразить с letter.html
У меня есть код для этого в letter.xql:
declare function letter:index($node as node(), $model as map())
{
for $resource in collection('/db/apps/Tobi-oshki/data'
let $uri := document-uri( root( $resource ) )
let $id := $resource//vg:letIdentifier/tei:idno[@type = "jlb"]/data()
let $doc := request:get-parameter("id", ())
return
<a href="{$uri}"> <p>letter: {$id}</p> </a>
};
here is the index.html:
<html xmlns="http://www.w3.org/1999/xhtml">
<meta charset="utf-8"/>
<head>
<title data-template="config:app-title">App Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta data-template="config:app-meta"/>
<div class="jumbotron">
<div class="card">
<div class="card-body">
<div data-template="letter:index"/>
</div>
</div>
</div>
</div>
</html>
Вот мой конроллер.xql:
xquery version "3.0";
declare variable $exist:path external;
declare variable $exist:resource external;
declare variable $exist:controller external;
declare variable $exist:prefix external;
declare variable $exist:root external;
if ($exist:path eq '') then
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<redirect url="{request:get-uri()}/"/>
</dispatch>
else if ($exist:path eq "/") then
(: forward root path to index.xql :)
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<redirect url="index.html"/>
</dispatch>
else if (ends-with($exist:resource, ".html")) then
(: the html page is run through view.xql to expand templates :)
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<view>
<forward url="{$exist:controller}/modules/view.xql"/>
</view>
<error-handler>
<forward url="{$exist:controller}/error-page.html" method="get"/>
<forward url="{$exist:controller}/modules/view.xql"/>
</error-handler>
</dispatch>
else if (contains($exist:resource, request:get-parameter("id", ()))) then
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<forward url="{$exist:controller}/templates/letter.html"/>
<view>
<forward url="{$exist:controller}/modules/view.xql">
<add-parameter name="id" value="{request:get-parameter("id", ())}.xml"/>
</forward>
</view>
</dispatch>
(: Resource paths starting with $shared are loaded from the shared-resources app :)
else if (contains($exist:path, "/$shared/")) then
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<forward url="/shared-resources/{substring-after($exist:path, '/$shared/')}">
<set-header name="Cache-Control" value="max-age=3600, must-revalidate"/>
</forward>
</dispatch>
else
(: everything else is passed through :)
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<cache-control cache="yes"/>
</dispatch>
Кто-нибудь может с этим помочь?
Комментарии:
1. Интересно, почему вы не добавляете шаблон, с помощью которого хотите отобразить содержимое, в
*.html
маршрут. Было бы полезно, если бы вы добавилиmodules/view.xql
сюда содержимое.2. У вашего контроллера нет правила, которое применялось бы к вашему запросу на ресурсы, содержащие
.xml
. Вам нужноif
приложение, которое перенаправляет запрос на ресурс с.xml
помощью шаблона html.3. @jbrehr здравствуйте, спасибо за ваш ответ. Я добавил код для .xml, но он все еще не работает, я отредактирую код в посте controller.xql.
4.
{$exist:resource}
это даст вам значениеfile1.xml
, которое вы.xml
связываете с параметром forfilename
. Пожалуйста , опубликуйте код дляtemplates/letter.html
и любой код Xquery, который вызывается из шаблона.5. @jbrehr Привет, я отредактировал весь пост, потому что я многое изменил в коде. У меня много ошибок, но я не знаю, что и как это исправить.