Я не могу отображать разные файлы данных с помощью одного html-файла в eXist-db

#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 связываете с параметром for filename . Пожалуйста , опубликуйте код для templates/letter.html и любой код Xquery, который вызывается из шаблона.

5. @jbrehr Привет, я отредактировал весь пост, потому что я многое изменил в коде. У меня много ошибок, но я не знаю, что и как это исправить.