xfy technology についての備忘録です。
Unknown XVCD を xfy Basic Edition 1.3 Beta 用に改訂しました。
XVCD ボキャブラリ群の名前空間 URI を変更しました。
h:html 要素の height プロパティの値を (auto から 1em に) 変更しました。
空白類文字だけから成るテキストノードの判別方法を (normalize-space() 関数を使う方法から function:white-space() 関数を使う方法に) 変更しました。
XVCD スクリプトファイルの URI を見直しました。
「(DocBook や DITA などの) 文書系 XML ボキャブラリ用 XVCD」の作成に便利な XVCD スクリプトモジュール「_default モジュール」を作ってみました。
文書系の XML ボキャブラリ用の XVCD スクリプトを作る場合、 (同類の XSLT スタイルシートを作る場合と同様に) プッシュスタイルで作ることが多いと思います。プッシュスタイルでは、必要に応じて要素ごとにテンプレートを追加していくので、処理済みの要素と未処理の要素とを視覚的に判別できると便利です。
_default モジュールは、 XVCD スクリプトに不可欠 (にもかかわらず内容が割と定型的) なルートテンプレートと、 2 種類の要素ノード用テンプレートとで構成されています。
<?xml version="1.0" encoding="utf-8"?> <xvcd:xvcd xmlns:xvcd="http://xmlns.xfy.com/xvcd" version="1.0"><!-- ルートテンプレート --><xvcd:template name="_default.root"> <xvcd:apply-templates select="."/> </xvcd:template><!-- 要素ノード用テンプレート (ルート要素用) --><xvcd:template match="*[not(parent::*)]"> <h:html xmlns:h="http://www.w3.org/1999/xhtml"> <h:body> <xvcd:next-match/> </h:body> </h:html> </xvcd:template><!-- 要素ノード用テンプレート --><xvcd:template match="*"> <xvcd:variable name="attributes"> <xvcd:for-each select="@*"> <xvcd:value-of select="concat(' ', name(), '=', '"', ., '"')"/> </xvcd:for-each> </xvcd:variable> <xvcd:choose> <xvcd:when test="boolean(child::node())"> <xvcd:value-of select="concat('<', name(), $attributes, '>')"/> <xvcd:apply-templates/> <xvcd:value-of select="concat('<', '/', name(), '>')"/> </xvcd:when> <xvcd:otherwise> <xvcd:value-of select="concat('<', name(), $attributes, '/', '>')"/> </xvcd:otherwise> </xvcd:choose> </xvcd:template> </xvcd:xvcd>
モジュールを利用する側の XVCD スクリプトから (xvcd:vocabulary 要素経由で) 呼び出されます。カレントノード (= ルート要素) にテンプレートを適用しているだけです。
当該 XML ボキャブラリを XHTML にマッピングするために h:html 要素と h:body 要素とを出力した上で、カレントノード (= ルート要素) に要素ノード用テンプレート (後述) を適用しています。このテンプレートは、モジュールを利用する側の XVCD スクリプト中で上書きされることを想定しています。
要素ノードの情報 (要素名や属性など) をタグ形式で出力しています。要素ノードが子ノードを持つ場合は「開始タグ + 要素の内容 + 終了タグ」として出力し、要素ノードが子ノードを持たない場合 (= 空要素の場合) は「空要素タグ」として出力します。このテンプレートも、モジュールを利用する側の XVCD スクリプト中で上書きされることを想定しています。
実際に _default モジュールを使って、とある DocBook 文書 (下記) 用の XVCD スクリプトを作ってみました。
http://svn.sourceforge.net/viewcvs.cgi/*checkout*/docbook/trunk/defguide5/en/src/ch05.xml
最初に、 XVCD スクリプトに _default モジュールをインポートし、ルートテンプレートを呼び出します。
<?xml version="1.0" encoding="utf-8"?> <xvcd:xvcd version="1.0" xmlns:xvcd = "http://xmlns.xfy.com/xvcd" xmlns:db = "http://docbook.org/ns/docbook"> <xvcd:import href="./_default.module"/> <xvcd:vocabulary match="db:*" call-template="_default.root" name="Chapter"/> </xvcd:xvcd>
この XVCD スクリプトを DocBook 文書に適用すると、 (次のように) すべてのタグが視覚化されます。
これで、プッシュスタイルでテンプレートを追加していく準備が整いました。
手始めに、 (パラグラフをあらわす) db:para 要素用のテンプレートを追加し、文章のアウトラインを把握しやすくします。
<?xml version="1.0" encoding="utf-8"?>
<xvcd:xvcd version="1.0"
xmlns:xvcd = "http://xmlns.xfy.com/xvcd"
xmlns:db = "http://docbook.org/ns/docbook"
xmlns:h = "http://www.w3.org/1999/xhtml">
<xvcd:import href="./_default.module"/>
<xvcd:vocabulary match="db:*" call-template="_default.root" name="Chapter"/>
<xvcd:template match="db:para">
<h:p>
<xvcd:apply-templates/>
</h:p>
</xvcd:template>
</xvcd:xvcd>
この XVCD スクリプトを DocBook 文書に適用すると、 (次のように) db:para 要素がブロックレベル要素として表示されるようになり、文章のアウトラインが把握しやすくなります。
次に、 (索引用のメタ情報をあらわす) db:indexterm 要素用のテンプレートを追加し、全体の見通しを良くします。
<?xml version="1.0" encoding="utf-8"?>
<xvcd:xvcd version="1.0"
xmlns:xvcd = "http://xmlns.xfy.com/xvcd"
xmlns:db = "http://docbook.org/ns/docbook"
xmlns:h = "http://www.w3.org/1999/xhtml">
<xvcd:import href="./_default.module"/>
<xvcd:vocabulary match="db:*" call-template="_default.root" name="Chapter"/>
<xvcd:template match="db:para">
<h:p>
<xvcd:apply-templates/>
</h:p>
</xvcd:template>
<xvcd:template match="db:indexterm"/>
</xvcd:xvcd>
この XVCD スクリプトを DocBook 文書に適用すると、 (次のように) db:indexterm 要素が表示されなくなり、全体の見通しが良くなります。
最後に、 (箇条書きをあらわす) db:itemizedlist 要素 + db:listitem 要素用のテンプレートを追加します。
<?xml version="1.0" encoding="utf-8"?>
<xvcd:xvcd version="1.0"
xmlns:xvcd = "http://xmlns.xfy.com/xvcd"
xmlns:db = "http://docbook.org/ns/docbook"
xmlns:h = "http://www.w3.org/1999/xhtml">
<xvcd:import href="./_default.module"/>
<xvcd:vocabulary match="db:*" call-template="_default.root" name="Chapter"/>
<xvcd:template match="db:para">
<h:p>
<xvcd:apply-templates/>
</h:p>
</xvcd:template>
<xvcd:template match="db:indexterm"/>
<xvcd:template match="db:itemizedlist">
<h:ul>
<xvcd:for-each select="child::db:listitem">
<h:li>
<xvcd:apply-templates/>
</h:li>
</xvcd:for-each>
</h:ul>
</xvcd:template>
</xvcd:xvcd>
この XVCD スクリプトを DocBook 文書に適用すると、 (次のように) db:itemizedlist 要素 + db:listitem 要素が箇条書きとして表示されるようになります。