XQuery/动态模块加载
外观
< XQuery
您想要有条件地导入模块。例如,该模块可能会提供一个包含所有用于为网页设置样式的函数的列表,例如标题/页脚和面包屑导航。
我们将使用 XQuery 函数 util:import-module()。此函数具有三个参数
- $namespace: 您要加载的模块的完整 URI,例如 http://example.com/my-module
- $prefix: 您想要用于引用模块中每个函数的前缀,例如 style
- $location: 您将从中加载模块的数据库路径,例如绝对路径 /db/modules/my-module.xqm 或相对路径 my-module.xqm
例如,以下将从 /db/modules 集合导入名为 my-module 的模块。
util:import-module(xs:anyURI('http://example.com/my-module'), 'style', xs:anyURI('/db/modules/my-module.xqm'))
函数 xs:anyURI 用于将每个字符串强制转换为 URL 类型。
由于命名空间是动态声明的,因此必须使用 util:eval 调用导入的函数。此函数的输入是一个包含 XQuery 表达式的字符串。例如:
util:eval('style:header()')
以下将随机加载两个样式模块中的一个。
xquery version "1.0";
declare option exist:serialize "method=xhtml media-type=text/html omit-xml-declaration=yes indent=yes";
let $module := if (math:random() < 0.5)
then
util:import-module(
xs:anyURI('http://example.com/style-a'),
'style',
xs:anyURI('style-a.xqm')
)
else
util:import-module(
xs:anyURI('http://example.com/style-b'),
'style',
xs:anyURI('style-b.xqm')
)
return
<html>
<head>
<title>Test of Dynamic Module Import</title>
{util:eval('style:import-css()')}
</head>
<body>
{util:eval('style:header()')}
{util:eval('style:breadcrumb()')}
<h1>Test of Dynamic Module Import</h1>
{util:eval('style:footer()')}
</body>
</html>
这是一个样式模块的示例。它具有四个函数。一个用于导入 CSS 文件,一个用于标题,一个用于导航面包屑,一个用于页脚。
xquery version "1.0";
module namespace style='http://example.com/style-a';
declare function style:import-css() {
<link type="text/css" rel="stylesheet" href="style-a.css"/>
};
declare function style:header() {
<div class="header">
<h1>Header for Style A</h1>
</div>
};
declare function style:breadcrumb() {
<div class="breadcrumb">
<h1>Breadcrumb for Style A</h1>
</div>
};
declare function style:footer() {
<div class="footer">
<h1>Footer for Style A</h1>
</div>
};
body {
color: blue;
}
xquery version "1.0";
module namespace style='http://example.com/style-b';
declare function style:import-css() {
<link type="text/css" rel="stylesheet" href="style-b.css"/>
};
declare function style:header() {
<div class="header">
<h1>Header for Style B</h1>
</div>
};
declare function style:breadcrumb() {
<div class="breadcrumb">
<h1>Breadcrumb for Style B</h1>
</div>
};
declare function style:footer() {
<div class="footer">
<h1>Footer for Style B</h1>
</div>
};
body {
color: red;
}