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)