XQuery/DocBook 到 HTML
外觀
< XQuery
您希望將 DocBook 文件轉換為 HTML 格式。
我們將使用 XQuery 型別轉換變換,將示例例項文件轉換為 XQuery 型別轉換模組。要開始此過程,您可以使用任何從 XML 架構生成例項文件的工具。然後,您可以編輯此文件以僅包含要轉換的元素。然後,您可以透過該工具執行此檔案以生成型別轉換 XQuery 模組。
我們的主要排程函式將具有以下結構
declare namespace db="http://docbook.org/ns/docbook";)
declare function db2html:transform($nodes as node()*) as item()* {
for $node in $nodes
return
typeswitch($node)
case text() return $node
case element(db:article) return db2html:article($node)
case element(db:book) return db2html:book($node)
case element(db:info) return db2html:info($node)
case element(db:para) return db2html:para($node)
case element(db:sect1) return db2html:sect1($node)
case element(db:title) return () (: all titles will be transformed by their parent node :)
case element(db:emphasis) return db2html:emphasis($node)
default return <u>{$node}</u>
};
注意以下幾點
- transform 函式以節點序列作為引數,並且對每個節點都返回型別轉換函式。
- transform 返回一個專案序列
- 預設操作是將節點從輸入複製到輸出。不在 case 語句中的所有節點都將無修改地傳遞。您可以透過更改 default 返回的型別來更改此預設行為。
- 對於每個元素,都會呼叫一個單獨的函式“元素函式”。如果元素是葉元素,則它們可以只返回葉元素的內容。如果不是葉元素,則必須為它們包含的每個子分支呼叫 transform。透過更改每個函式,您可以更改該元素建立的輸出。這種結構使您的轉換模組化,易於維護。
- 每個元素的名稱空間都是 Docbook 名稱空間 (db 是與 DocBook 5 URL http://docbook.org/ns/docbook 關聯的字首)
- 不在 case 語句中的所有元素都將返回一個“u”用於未知元素包裝器。這使得它們在除錯時易於識別。
每個元素函式都有一個簡單的結構。例如,<para> 元素可能具有以下結構
declare function db2html:para($node as node()) as element() {
<p>
{db2html:transform($node/node())}
</p>
};
這將把所有 <db:para> 節點轉換為 <p> 節點。請注意,輸入型別是 node(),返回型別是 element()。另請注意,由於 <para> 元素包含其他子節點(元素和文字),因此它們都由對 db2html:transform($node/node()) 的遞迴呼叫進行處理。
以下是上述模組的函式完整列表。
declare function db2html:article($node as node()) as element() {
<div class="article">
{db2html:transform($node/node())}
</div>
};
declare function db2html:book($node as node()) as element() {
<div class="book">
{db2html:transform($node/node())}
</div>
};
declare function db2html:info($node as node()) as element() {
<div class="info">
<h1>{$node/db:title/text()}</h1>
</div>
};
declare function db2html:sect1($node as node()) as element() {
<div class="sect1">
<h2>{$node/db:title/text()}</h2>
{db2html:transform($node/node())}
</div>
};
declare function db2html:title($node as node()) as element() {
<div class="title">
{db2html:transform($node/node())}
</div>
};
declare function db2html:para($node as node()) as element() {
<p>
{db2html:transform($node/node())}
</p>
};
declare function db2html:emphasis($node as node()) as element() {
<b>
{db2html:transform($node/node())}
</b>
};
<article xmlns="http://docbook.org/ns/docbook" version="5.0">
<info>
<title>Article Template Title</title>
</info>
<sect1>
<title>Section1 Title</title>
<para>Typewsitch transforms are <emphasis role="bold">very</emphasis> powerful.</para>
</sect1>
</article>
要呼叫轉換,您只需將 DocBook 文件的根節點傳遞給函式即可
let $input := doc('/db/my-docbook-5-document.xml')/db:article
let $output := db2html:transform($input)
return $output
請注意,您必須在 doc() 函式之後放置要轉換的根元素。如果沒有,doc() 函式將返回一個文件節點,該節點將與任何文件 case 語句都不匹配。
<div class="article">
<div class="info">
<h1>Article Template Title</h1>
</div>
<div class="sect1">
<h2>Section1 Title</h2>
<p>Typewsitch transforms are <b>very</b>powerful.</p>
</div>
</div>
此示例在 Google Code 上的原始碼:http://code.google.com/p/xrx/source/browse/#svn%2Ftrunk%2F21-docbook-2-html
Chis Wallace 提供了一個工具,可以將 XML Docbook 轉換為型別轉換,如下所示:生成骨架型別轉換轉換模組