2

这可能真的很简单,但我不知道该怎么做。我有这些东西:

  • 一个 HTML 文件
  • 一个 eXist DB,其集合仅包含一个带有名称的 XML 文件
  • 还有一个非常基本的 xquery 文件,其中包含命令count(//name)

当然,当我在 eXist 客户端中执行 xqy 文件时,它运行良好,但我想做的只是在我的 HTML 文件中打印:

文件中的名称:49 // 49 是计数的结果(//名称)

我应该怎么办?

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) 将返回一个完整的 HTML 页面,其中 $title 在 head/title 中在 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 视为对您已注册的模块中的函数 count-names() 的引用,例如 /db/apps/myapp/modules/app.xql。因此,假设您已经创建了该模块和函数 app:count-names(),那么当您调用 get-names.html 页面时,数据库会动态地将上面的元素转换为 app:count-names() 的结果,例如,42。

我希望这有帮助。

于 2012-12-16T22:06:17.593 回答