跳转到内容

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>

运行

样式 A 模块

[编辑 | 编辑源代码]

这是一个样式模块的示例。它具有四个函数。一个用于导入 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>
};

样式 A CSS

[编辑 | 编辑源代码]
body {
    color: blue;
}

样式 B 模块

[编辑 | 编辑源代码]
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>
};

样式 B CSS

[编辑 | 编辑源代码]
body {
   color: red;
}
华夏公益教科书