跳转到内容

XQuery/创建 XQuery 函数

来自维基教科书,开放的书籍,开放的世界

您想避免重复 XQuery 代码或创建更模块化的 XQuery 程序。

使用 XQuery 函数将任何 XQuery 代码块封装在函数包装器中。

在您的 XQuery 程序中,只要您看到想要标准化的 XQuery 或 XML 代码分组,最好开始创建您自己的 XQuery 函数。

静态内容

[编辑 | 编辑源代码]

静态内容是固定的内容,不会因参数的使用而更改。XQuery 函数非常适合存储静态内容库。

例如,如果所有 HTML 页面都包含相同的代码块,其中包含您的徽标和标题文本,则可以创建一个简单的 XQuery 函数来编码此功能。以下是您想要标准化的 HTML 代码

<div class="web-page-header">
   <img src="images/mylogo.jpg" alt="Our Logo"/>
   <h1>Acme Widgets Inc.</h1>
</div>
declare function local:header() as node() {
    <div class="web-page-header">
        <img src="images/mylogo.jpg" alt="Our Logo"/>
        <h1>Acme Widgets Inc.</h1>
    </div>
};

当您想要引用它时,只需通过将其放在您的 HTML 页面中并将其括在花括号中来调用该函数

<html>
   <head>
      <title>Sample Web Page</title>
   </head>
   <body>
     {local:header()}
   </body>
</html>

请注意,这些函数名称以“local:”开头。这是仅在同一个 XQuery 主模块中调用的函数的默认命名空间。

如果您想将函数存储在单独的文件中,您可以这样做。这样的文件称为“库模块”。要使用此模块中的函数,您需要在查询的前言中“导入”该模块。将代码存储在函数和模块中的好处是,如果您需要更改函数,您只需要在一个位置进行更改,而不是在您复制和粘贴了相同代码的多个位置进行更改。

以下文件(我们将保存为 webpage.xqm)是这方面的示例(另请注意添加了页脚函数)

module namespace webpage='http://www.example.com/webpage';

declare function webpage:header() as node() {
    <div class="web-page-header">
        <img src="images/mylogo.jpg" alt="Our Logo"/>
        <h1>Acme Widgets Inc.</h1>
    </div>
};

declare function webpage:footer() as node() {
    <div class="web-page-footer">
        <img src="images/mylogo.jpg" alt="Our Logo"/>
        <p>Acme Widgets Inc.</p>
    </div>
};

模块以模块命名空间的声明开头。这里我们使用一个任意的命名空间“webpage”。

静态页面组装

[编辑 | 编辑源代码]

要使用此函数模块,您必须在 XQuery 文件的顶部导入该模块(以下“导入模块”表达式假设您的 XQuery 文件与模块文件 webpage.xqm 在同一个目录中)

xquery version "1.0";

import module namespace webpage='http://www.example.com/webpage' at 'webpage.xqm';

let $title := 'Sample Web Page'
return
    <html>
        <head>
            <title>{$title}</title>
        </head>
        <body>
            {webpage:header()}
            <h1>{$title}</h1>
            <div class="content">Content goes here.</div>
            {webpage:footer()}
        </body>
    </html>

动态内容

[编辑 | 编辑源代码]

与静态内容不同,动态内容可以通过在函数中包含参数来修改。一种非常常见的方法是使用“页面组装器”函数,该函数包含文档标题和内容等参数。这是一个此类函数的示例。

动态页面组装函数

[编辑 | 编辑源代码]
xquery version "1.0";

declare function webpage:assemble-page($title as xs:string, $content as node()) {
<html>
   <head>
      <title>{$title}</title>
   </head>
   <body>
     {webpage:header()}
     <h1>{$title}</h1>
     <div class="content">{$content}</div>
     {webpage:footer()}
   </body>
</html>
};

您的网页现在都可以引用一个像下面这样的中心页面组装器。

import module namespace webpage='http://www.example.com/webpage' at 'webpage.xqm';

let $title := 'Sample Web Page'
let $content := <p>Content goes here.</p>

return webpage:assemble-page($title, $content)
华夏公益教科书