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)