2

それはおそらく本当に簡単ですが、私はそれを行う方法がわかりません。私はこれらのものを持っています:

  • HTMLファイル
  • 単に名前の付いたXMLファイルを含むコレクションを持つeXistDB
  • そして、コマンドを含む非常に基本的なxqueryファイルcount(//name)

もちろん、eXistクライアントでxqyファイルを実行するとうまく機能しますが、私がやりたいのは、HTMLファイルに次のように出力することです。

ファイル内の名前:49 // 49はcount(// name)の結果です

私は何をすべきか?

4

1 に答える 1

2

従来、eXist-db(*)では、XQueryは.htmlファイルに埋め込まれていません。XQueryファイル自体が結果をアセンブルし、ブラウザーにシリアル化します。したがって、次のような.xqyファイルがある可能性があります(たとえば、http://yourserver.com:8080/exist/apps/myapp/get-names.xqyを介して呼び出されます

xquery version "1.0";

declare option exist:serialize "method=xhtml media-type=text/html";

let $count := count(//name)
return
    <html>
        <head/>
        <body>
            <div><p>There are {$count} names in the database</p></div>
        </body>
    </html>

ヘッダーなど、このファイルにプルしたいHTMLの静的スニペットがある場合は、XQueryに埋め込むか、doc()関数を使用して呼び出し、上記の$countで行ったように挿入します。

let $header := doc('/db/myapp/header.html')

このパターンを拡張し、独自のテンプレートモジュールを開発して、アプリのコンテンツをテンプレートにフィードすることもできます。つまり、template:assemble-page($ title、$ content)は、ヘッド/タイトルに$titleを含む完全なHTMLページを返します。およびbody/h1内、およびbody内のコンテンツ-関数で指定された静的ヘッダー、フッターなど。

(*)eXist-db 2.0(現在リリース候補として利用可能)の時点で、HTMLテンプレート内に関数呼び出しを埋め込むことができる新しいテンプレートフレームワークがあります。これは、XQueryとHTMLの混合/ネストが少なくなり、関心の分離がより明確になることを意味します。詳細については、この記事「eXist-dbでのWebアプリケーション開発入門」を参照してください。それは本当にとてもエレガントで、私が上で説明したアプローチよりもこれが好ましいと思うかもしれません。このフレームワークでは、.htmlファイルをそのまま保持し、次の方法でcount(// name)ルーチンを参照します。

<p>There are <span class="app:count-names"/> names in the database</p>

フレームワークは、span / @ classを、登録したモジュール(/db/apps/myapp/modules/app.xqlなど)の関数count-names()への参照として扱います。したがって、そのモジュールと関数app:count-names()を作成したとすると、get-names.htmlページを呼び出すと、データベースは上記の要素をapp:count-names()の結果に動的に変換します。例:42。

これがお役に立てば幸いです。

于 2012-12-16T22:06:17.593 に答える