xfy.memo

xfy technology についての備忘録です。

2006 年 6 月のアーカイブ

2006 年 6 月 18 日 Unknown XVCD (xfy Basic Edition 1.3 Beta 用)

Unknown XVCD を xfy Basic Edition 1.3 Beta 用に改訂しました。

Unknown XVCD

http://homepage.mac.com/shin_itani/xvcd/2006-06-18/unknown.xvcd

変更内容

2006 年 6 月 20 日 「文書系 XML ボキャブラリ用 XVCD」のための XVCD スクリプトモジュール

「(DocBook や DITA などの) 文書系 XML ボキャブラリ用 XVCD」の作成に便利な XVCD スクリプトモジュール「_default モジュール」を作ってみました。

_default モジュール

http://homepage.mac.com/shin_itani/xvcd/2006-06-20/_default.module

背景

文書系の XML ボキャブラリ用の XVCD スクリプトを作る場合、 (同類の XSLT スタイルシートを作る場合と同様に) プッシュスタイルで作ることが多いと思います。プッシュスタイルでは、必要に応じて要素ごとにテンプレートを追加していくので、処理済みの要素と未処理の要素とを視覚的に判別できると便利です。

_default モジュールの構造

_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(), '=', '&quot;', ., '&quot;')"/>
      </xvcd:for-each>
    </xvcd:variable>

    <xvcd:choose>
      <xvcd:when test="boolean(child::node())">
        <xvcd:value-of select="concat('&lt;', name(), $attributes, '&gt;')"/>
        <xvcd:apply-templates/>
        <xvcd:value-of select="concat('&lt;', '/', name(), '&gt;')"/>
      </xvcd:when>
      <xvcd:otherwise>
        <xvcd:value-of select="concat('&lt;', name(), $attributes, '/', '&gt;')"/>
      </xvcd:otherwise>
    </xvcd:choose>
  </xvcd:template>

</xvcd:xvcd>
ルートテンプレート

モジュールを利用する側の XVCD スクリプトから (xvcd:vocabulary 要素経由で) 呼び出されます。カレントノード (= ルート要素) にテンプレートを適用しているだけです。

要素ノード用テンプレート (ルート要素用)

当該 XML ボキャブラリを XHTML にマッピングするために h:html 要素と h:body 要素とを出力した上で、カレントノード (= ルート要素) に要素ノード用テンプレート (後述) を適用しています。このテンプレートは、モジュールを利用する側の XVCD スクリプト中で上書きされることを想定しています。

要素ノード用テンプレート

要素ノードの情報 (要素名や属性など) をタグ形式で出力しています。要素ノードが子ノードを持つ場合は「開始タグ + 要素の内容 + 終了タグ」として出力し、要素ノードが子ノードを持たない場合 (= 空要素の場合) は「空要素タグ」として出力します。このテンプレートも、モジュールを利用する側の XVCD スクリプト中で上書きされることを想定しています。

_default モジュールを使った XVCD スクリプトの作成例

実際に _default モジュールを使って、とある DocBook 文書 (下記) 用の XVCD スクリプトを作ってみました。

Customizing DocBook - DocBook 5.0: The Definitive Guide

http://svn.sourceforge.net/viewcvs.cgi/*checkout*/docbook/trunk/defguide5/en/src/ch05.xml

  1. 最初に、 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 文書に適用すると、 (次のように) すべてのタグが視覚化されます。

    スクリーンショット (PNG 形式、約 56KB)

    これで、プッシュスタイルでテンプレートを追加していく準備が整いました。

  2. 手始めに、 (パラグラフをあらわす) 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 要素がブロックレベル要素として表示されるようになり、文章のアウトラインが把握しやすくなります。

    スクリーンショット (PNG 形式、約 48KB)

  3. 次に、 (索引用のメタ情報をあらわす) 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 要素が表示されなくなり、全体の見通しが良くなります。

    スクリーンショット (PNG 形式、約 40KB)

  4. 最後に、 (箇条書きをあらわす) 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 要素が箇条書きとして表示されるようになります。

    スクリーンショット (PNG 形式、約 44KB)


Powered by Movable Type 3.2-ja-2

Copyright © 2005, 2006 Shin All rights reserved.