<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>xfy.memo</title>
      <link>http://homepage.mac.com/shin_itani/memo/xfy/</link>
      <description>xfy technology についての備忘録です。</description>
      <language>ja</language>
      <copyright>Copyright 2007</copyright>
      <lastBuildDate>Mon, 19 Feb 2007 23:00:42 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=3.2-ja-2</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>最小構成 (?) の xfy Personal Client</title>
         <description><![CDATA[<p>xfy Basic Edition を使っていると、 xfy Personal Client や xfy Blog Editor など、アプリケーション名と思わしき固有名詞に多々出くわします。 xfy Basic Edition は、 xfy Personal Client といくつかの xfy プラグインとをひとまとめにしたものですが (多分)、ではその中核となる xfy Personal Client は、一体どのような姿をしているのでしょうか?</p>
<p>というわけで、 xfy Basic Edition に同梱されている xfy プラグインを取り除き、最小構成と思われる xfy Personal Client を取り出してみました。</p>

<h4><code class=" db:filename.directory">bin/plugins/com.xfy</code> ディレクトリ</h4>
<p>xfy Basic Edition の <code class=" db:filename.directory">bin</code> ディレクトリには、 <code class=" db:filename ">xfyClient.jar</code> や <code class=" db:filename ">xfyBlogEditor.jar</code> など、アプリケーション本体と思わしき JAR ファイルがいくつかあります。これらのうち、 <code class=" db:filename ">xfyBlogEditor.jar</code> や <code class=" db:filename ">xfyViewDesigner.jar</code> などは単なるランチャーであり (多分)、その実体 (= xfy プラグイン) はその他の xfy プラグインと一緒に <code class=" db:filename.directory">bin/plugins/com.xfy</code> ディレクトリに格納されているようです。</p>
<p>というわけで、このディレクトリに格納されている xfy プラグインについて調べてみました (その他のディレクトリに格納されている xfy プラグインについては調べていません)。</p>

<h4>必要不可欠な xfy プラグイン</h4>
<p>まず、 xfy Personal Client を起動するために、下記の 2 個の xfy プラグインが必要なようです (これらがないと、 xfy Personal Client は起動しません)。</p>
<ul>
<li>
	<p><code class=" db:filename ">DefaultTools.jar</code></p>
</li>
<li>
	<p><code class=" db:filename ">Life.jar</code></p>
</li>
</ul>
<p><a href="/shin_itani/memo/xfy/2007/02/19T230042/step01.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2007/02/19T230042/step01_thumbnail.png" /></a></p>
<p>さらに、 <abbr title="User Interface">UI</abbr> を日本語化するために、下記の 2 ファイル (= xfy アーカイブリソースファイル) が必要なようです。</p>
<ul>
<li>
	<p><code class=" db:filename ">DefaultTools.ja.xar</code></p>
</li>
<li>
	<p><code class=" db:filename ">Life.ja.xar</code></p>
</li>
</ul>
<p><a href="/shin_itani/memo/xfy/2007/02/19T230042/step02.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2007/02/19T230042/step02_thumbnail.png" /></a></p>
<p>上記の 4 ファイルがあれば、とりあえず xfy Personal Client は起動するようです。ただし、テンプレートが一つもないので、 XML 文書を作成することはできません。加えて、ボキャブラリコンポーネントも <a href="http://www.xfy.com/jp/manual/1.3/documents/app/client/1.0/view.html#component" title="ボキャブラリコンポーネントを切り替える - 文書の見方を変える - xfy.com">Icon ボキャブラリコンポーネント</a>しかないので、既存の XML 文書を表示することも編集することもできません。</p>
<p>また、メニューの中には、項目がなくなっていたり非活性だったり、選ぶとエラーが発生したりするものもあります。例えば、[ファイル] - [ページスタイル] を選ぶとエラーが発生します。</p>
<p><a href="/shin_itani/memo/xfy/2007/02/19T230042/step03.png"><img alt="スクリーンショット (PNG 形式、約 28KB)" src="/shin_itani/memo/xfy/2007/02/19T230042/step03_thumbnail.png" /></a></p>

<h4>メニュー選択時のエラーをなくす</h4>
<p>メニュー選択時のエラーをなくすためには、下記の 2 個の xfy プラグインが必要なようです。</p>
<ul>
<li>
	<p><code class=" db:filename ">VocabularyConnection.jar</code></p>
</li>
<li>
	<p><code class=" db:filename ">Instructions.jar</code></p>
</li>
</ul>
<p>これで、[ファイル] - [ページスタイル] 等が正しく機能するようになります。</p>
<p><a href="/shin_itani/memo/xfy/2007/02/19T230042/step04.png"><img alt="スクリーンショット (PNG 形式、約 36KB)" src="/shin_itani/memo/xfy/2007/02/19T230042/step04_thumbnail.png" /></a></p>
<p>また、上記の xfy プラグインを追加したことでボキャブラリコネクションが機能し始めたからでしょうか、 xfy Start ボキャブラリ (= 「xfy へようこそ」ページ記述用の XML ボキャブラリ) が XHTML   にマッピング (= ボキャブラリコネクション) されるようになりました。</p>
<p><a href="/shin_itani/memo/xfy/2007/02/19T230042/step05.png"><img alt="スクリーンショット (PNG 形式、約 48KB)" src="/shin_itani/memo/xfy/2007/02/19T230042/step05_thumbnail.png" /></a></p>

<h4>まとめ</h4>
<ul>
<li>
	<p>最小構成 (?) の xfy Personal Client は、下記の 6 個の xfy プラグイン (xfy アーカイブリソースファイルを含む) で構成される。</p>
	<ul>
	<li>
		<p><code class=" db:filename ">DefaultTools.jar</code></p>
	</li>
	<li>
		<p><code class=" db:filename ">DefaultTools.ja.xar</code></p>
	</li>
	<li>
		<p><code class=" db:filename ">Life.jar</code></p>
	</li>
	<li>
		<p><code class=" db:filename ">Life.ja.xar</code></p>
	</li>
	<li>
		<p><code class=" db:filename ">VocabularyConnection.jar</code></p>
	</li>
	<li>
		<p><code class=" db:filename ">Instructions.jar</code></p>
	</li>
	</ul>
</li>
<li>
	<p>ただし、この構成では (恐らく) 何もできない。</p>
</li>
<li>
	<p>この構成に、使いたい xfy コンポーネントだけを選んで追加すれば、軽量の xfy Personal Client を得られる (かもしれない)。</p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2007/02/19T230042.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2007/02/19T230042.html</guid>
         <category></category>
         <pubDate>Mon, 19 Feb 2007 23:00:42 +0900</pubDate>
      </item>
            <item>
         <title>xfy Personal Client で XHTML 文書を編集すると、連続する空白類文字が別の文字に置換される ?</title>
         <description><![CDATA[<p><a href="/shin_itani/memo/xfy/2006/11/26T230819.html" title="連続する空白類文字の扱いについて - xfy.memo">xfy Personal Client の XHTML コンポーネントの不思議な挙動</a>について、さらに調べてみました。どうやら XHTML コンポーネントは、文書が編集されたタイミングで、文書中の空白類文字を別の文字に置き換えてしまうようです。</p>

<h4>試したこと (その 1)</h4>
<p>まず、下記の仮説の下、 XHTML 文書のレンダリング結果が変わるかどうかを調べてみました。</p>
<dl>
<dt>仮説</dt>
<dd>
	<ul>
	<li>
		<p>XHTML コンポーネントの HTML レンダラは、 CSS の <code class=" db:property ">white-space</code> プロパティ (デフォルト値: <code class=" db:literal ">normal</code>) を正しく解釈できていないのでは ?</p>
	</li>
	<li>
		<p>それを回避するために、 XHTML 文書を読み込んだタイミングで何らかのレンダリング修正処理を加えているのでは ?</p>
	</li>
	</ul>
</dd>
<dt>検証方法</dt>
<dd>
	<ol>
	<li>
		<p>サンプル文書 (<a href="/shin_itani/memo/xfy/2006/11/26T230819.html" title="連続する空白類文字の扱いについて - xfy.memo">先のエントリー</a>で挙げた XHTML 文書) を xfy Personal Client で読み込み、</p>
	</li>
	<li>
		<p>編集し (= 一つにまとめられていた空白類文字が復元される)、</p>
	</li>
	<li>
		<p>上書き保存した上で、</p>
	</li>
	<li>
		<p>再読み込みする。</p>
	</li>
	</ol>
	<p>これで XHTML 文書が正しく表示されれば、文書の読み込み時に何らかのレンダリング修正処理を加えていると見なせます。</p>
</dd>
<dt>結果</dt>
<dd>
	<ul>
	<li>
		<p>XHTML 文書は正しく表示されない (= 復元された空白類文字はそのまま)。</p>
		<p><a href="/shin_itani/memo/xfy/2006/11/27T230654/xfy01.png"><img alt="スクリーンショット (PNG 形式、約 48KB)" src="/shin_itani/memo/xfy/2006/11/27T230654/xfy01_thumbnail.png" /></a></p>
	</li>
	<li>
		<p>上書き保存した XHTML 文書中を <a href="http://www.oxygenxml.com/index.html" title="&lt;oXygen/&gt; XML editor - oxygenxml.com">&lt;oXygen/&gt;</a> (XML エディタ) で確認したところ、文書中の空白類文字が「no-break space (<code class=" db:literal ">&amp;#xa0;</code> で参照される文字)」と「空白 (<code class=" db:literal ">&amp;#x20;</code> で参照される文字)」とのペアに置き換えられていた。</p>
		<p><a href="/shin_itani/memo/xfy/2006/11/27T230654/oxygen01.png"><img alt="スクリーンショット (PNG 形式、約 84KB)" src="/shin_itani/memo/xfy/2006/11/27T230654/oxygen01_thumbnail.png" /></a></p>
	</li>
	</ul>
</dd>
</dl>
<p>というわけで、 XHTML 文書を読み込んだタイミングで何らかのレンダリング修正処理を加えているわけではなく、文書の編集後に文書中の空白類文字を別の文字に置き換えているようです。</p>

<h4>試したこと (その 2)</h4>
<p>次に、どのタイミングで XHTML 文書中の空白類文字が別の文字に置き換えられているのかを調べてみました。</p>
<dl>
<dt>仮説</dt>
<dd>
	<ul>
	<li>
		<p>XHTML コンポーネントの挙動からして、 (文書が保存されたタイミングではなく、) 文書が編集されたタイミングで、文書中の空白類文字が別の文字に置き換えられているのでは ?</p>
	</li>
	</ul>
</dd>
<dt>検証方法</dt>
<dd>
	<ol>
	<li>
		<p>サンプル文書を xfy Personal Client で読み込み、</p>
	</li>
	<li>
		<p>ソースをクリップボードにコピーし、</p>
	</li>
	<li>
		<p>その内容を &lt;oXygen/&gt; で確認する (これをサンプル文書 (対照区) とする)。</p>
	</li>
	<li>
		<p>さらに、サンプル文書を編集し (= 一つにまとめられていた空白類文字が復元される)、</p>
	</li>
	<li>
		<p>ソースをクリップボードにコピーし、</p>
	</li>
	<li>
		<p>その内容を &lt;oXygen/&gt; で確認する (これをサンプル文書 (実験区) とする)。</p>
	</li>
	</ol>
</dd>
<dt>結果</dt>
<dd>
	<ul>
	<li>
		<p>サンプル文書 (対照区) 中の空白類文字はそのまま。</p>
		<p><a href="/shin_itani/memo/xfy/2006/11/27T230654/oxygen02.png"><img alt="スクリーンショット (PNG 形式、約 84KB)" src="/shin_itani/memo/xfy/2006/11/27T230654/oxygen02_thumbnail.png" /></a></p>
	</li>
	<li>
		<p>サンプル文書 (実験区) 中の空白類文字は、 no-break space と空白とのペアに置き換えられていた。</p>
		<p><a href="/shin_itani/memo/xfy/2006/11/27T230654/oxygen03.png"><img alt="スクリーンショット (PNG 形式、約 84KB)" src="/shin_itani/memo/xfy/2006/11/27T230654/oxygen03_thumbnail.png" /></a></p>
	</li>
	</ul>
</dd>
</dl>
<p>というわけで、 <em>XHTML 文書が編集されたタイミングで、文書中の空白類文字が別の文字に置き換えられている</em>ことがわかりました。</p>

<h4>まとめ</h4>
<ul>
<li>
	<p>XHTML コンポーネントでは、文書が編集されたタイミングで、文書中の空白類文字が別の文字に置き換えられてしまう。</p>
</li>
<li>
	<p>「空白が連続する」のと「no-break space と空白とのペアが連続する」のとでは、文書の意味が異なる (後者は明らかに見た目を重視している)。見た目に重きを置くのであれば、 <code class=" db:tag.element ">pre</code> 要素としてマークアップすべきであり、文字の置き換えで対処すべきではない。</p>
</li>
<li>
	<p>が、ボキャブラリコンポーネントとして実装されている以上、この現象は回避できない ?</p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/11/27T230654.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/11/27T230654.html</guid>
         <category></category>
         <pubDate>Mon, 27 Nov 2006 23:06:54 +0900</pubDate>
      </item>
            <item>
         <title>連続する空白類文字の扱いについて</title>
         <description><![CDATA[<p>xfy Personal Client の XHTML <del datetime="2006-11-27">ボキャブラリ</del>コンポーネントについて調べていたところ、空白類文字周りで不思議な現象に出くわしました。</p>

<h4>正しい (と思われる) 空白類文字の扱い</h4>
<p>下記の XHTML 文書を xfy Personal Client で表示すると、</p>
<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
  &lt;body&gt;
    &lt;p&gt;0123456789abcdef&lt;/p&gt;
    &lt;p&gt;0             ef&lt;/p&gt;
    &lt;p&gt;01             f&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>パラグラフ中の連続する空白類文字は一つにまとめられて表示されます (= XHTML + CSS 的に正しい挙動)。</p>
<p><a href="/shin_itani/memo/xfy/2006/11/26T230819/step01.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/11/26T230819/step01_thumbnail.png" /></a></p>

<h4>正しくない (と思われる) 空白類文字の扱い</h4>
<p>が、例えば 2 番目のパラグラフ中の文字 <q>e</q> を削除すると……、</p>
<p><a href="/shin_itani/memo/xfy/2006/11/26T230819/step02.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/11/26T230819/step02_thumbnail.png" /></a></p>
<p>一つにまとめられていた空白類文字が復元 (?) してしまいます (= XHTML + CSS 的に正しくない挙動)。</p>
<p><a href="/shin_itani/memo/xfy/2006/11/26T230819/step03.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/11/26T230819/step03_thumbnail.png" /></a></p>
<p>同様に、 3 番目のパラグラフ中の文字 <q>1</q> を削除すると……、</p>
<p><a href="/shin_itani/memo/xfy/2006/11/26T230819/step04.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/11/26T230819/step04_thumbnail.png" /></a></p>
<p>やはり、一つにまとめられていた空白類文字文字が復元してしまいます。</p>
<p><a href="/shin_itani/memo/xfy/2006/11/26T230819/step05.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/11/26T230819/step05_thumbnail.png" /></a></p>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/11/26T230819.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/11/26T230819.html</guid>
         <category></category>
         <pubDate>Sun, 26 Nov 2006 23:08:19 +0900</pubDate>
      </item>
            <item>
         <title>xfy Personal Client 1.0 のメニューを、 Mac OS メニューバーに組み込めました</title>
         <description><![CDATA[<p><a href="/shin_itani/memo/xfy/2006/10/05T003919.html" title="xfy Personal Client 1.0 のメニューは、 Mac OS メニューバーに組み込めない ? - xfy.memo">先のエントリー</a>で上手くいかなかった Mac OS X メニューバーへの組み込みの件について<a href="https://www.xfytec.com/community/modules/newbb/viewtopic.php?topic_id=167&amp;forum=15" title="xfy のメニューを Mac OS メニューバーに表示するには ? - xfy Community">フォーラムにポストした</a>ところ、 (動作保証外ですが) 対策方法を教えていただきました。</p>

<h4>対策方法を試した結果</h4>
<p>xfy Personal Client 1.0 では、 JVM を再起動しているそうです。この JVM の再起動を抑止することで、 java コマンドのパラメータが有効になるとのことでした。</p>
<dl>
<dt>xfy Personal Client 1.0 での結果</dt>
<dd>
	<dl>
	<dt>コマンドライン</dt>
	<dd>
		<pre class=" db:programlisting ">$ <kbd>java -Dapple.laf.useScreenMenuBar=true \</kbd>
&gt; <kbd><em>-Dcom.xfy.startup.XfyStartup.without-jvm-restart=true</em> \</kbd>
&gt; <kbd>-jar xfy-be1_3-060810/bin/xfyClient.jar</kbd></pre>
	</dd>
	<dt>実行結果</dt>
	<dd>
		<p><a href="/shin_itani/memo/xfy/2006/10/30T232120/xfy-pc10.png"><img alt="スクリーンショット (PNG 形式、約 52KB)" src="/shin_itani/memo/xfy/2006/10/30T232120/xfy-pc10_thumbnail.png" /></a></p>
	</dd>
	</dl>
</dd>
</dl>
<p>それにしても、なぜ JVM を再起動しているのでしょう……</p>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/10/30T232120.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/10/30T232120.html</guid>
         <category></category>
         <pubDate>Mon, 30 Oct 2006 23:21:20 +0900</pubDate>
      </item>
            <item>
         <title>xfy Personal Client 1.0 のメニューは、 Mac OS メニューバーに組み込めない ?</title>
         <description><![CDATA[<p>下記の情報を参考に、 xfy Personal Client 1.0 のメニューを Mac OS メニューバーに組み込んでみました。</p>
<dl>
<dt>2004-11-20 xfy メモ - KENZ</dt>
<dd>
	<p><a href="http://d.hatena.ne.jp/KENZ/20041120#p1" class=" db:uri ">http://d.hatena.ne.jp/KENZ/20041120#p1</a></p>
</dd>
</dl>

<h4>結果</h4>
<p>xfy Basic Edition 1.0 では正しく組み込まれましたが、 xfy Personal Client 1.0 (xfy Basic Edition 1.3) では正しく組み込まれませんでした。残念…… (パラメータの指定が間違っているのかもしれません)</p>
<dl>
<dt>xfy Basic Edition 1.0 での結果</dt>
<dd>
	<dl>
	<dt>コマンドライン</dt>
	<dd>
		<pre class=" db:programlisting ">$ <kbd>java -Dapple.laf.useScreenMenuBar=true \</kbd>
&gt; <kbd>-jar xfy_combo_pack_051114/bin/xfyBasicEdition.jar</kbd></pre>
	</dd>
	<dt>実行結果</dt>
	<dd>
		<p><a href="/shin_itani/memo/xfy/2006/10/05T003919/xfy-be10.png"><img alt="スクリーンショット (PNG 形式、約 36KB)" src="/shin_itani/memo/xfy/2006/10/05T003919/xfy-be10_thumbnail.png" /></a></p>
	</dd>
	</dl>
</dd>
<dt>xfy Personal Client 1.0 での結果</dt>
<dd>
	<dl>
	<dt>コマンドライン</dt>
	<dd>
		<pre class=" db:programlisting ">$ <kbd>java -Dapple.laf.useScreenMenuBar=true \</kbd>
&gt; <kbd>-jar xfy-be1_3-060810/bin/xfyClient.jar</kbd></pre>
	</dd>
	<dt>実行結果</dt>
	<dd>
		<p><a href="/shin_itani/memo/xfy/2006/10/05T003919/xfy-pc10.png"><img alt="スクリーンショット (PNG 形式、約 52KB)" src="/shin_itani/memo/xfy/2006/10/05T003919/xfy-pc10_thumbnail.png" /></a></p>
	</dd>
	</dl>
</dd>
</dl>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/10/05T003919.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/10/05T003919.html</guid>
         <category></category>
         <pubDate>Thu, 05 Oct 2006 00:39:19 +0900</pubDate>
      </item>
            <item>
         <title>DocBook 用のボキャブラリコンポーネント (要素の種類の変更)</title>
         <description><![CDATA[<p>要素を増やせるようになったので、今度は要素の種類を変更できるようにします。</p>

<h4>現時点でのボキャブラリコンポーネントの外部仕様</h4>
<p>DocBook 用のボキャブラリコンポーネントとして、下記の機能を実装します。</p>
<ul>
<li>
	<p>各要素が表示される (実装済み)。</p>
</li>
<li>
	<p>各要素の内容 (テキストノード) を編集できる (実装済み)。</p>
</li>
<li>
	<p>要素が空要素用の場合 → プレースホルダを示す文字列が表示される (実装済み)。</p>
</li>
<li>
	<p>カレット位置に応じて要素の挿入、分割、追加ができる (実装済み)。</p>
</li>
<li>
	<p>要素の種類を変更できる。</p>
</li>
</ul>

<h4>要素の種類を変更する</h4>
<p>パラグラフをプログラムリストに、プログラムリストをパラグラフに、それぞれ変更できるようにします。前回の要素の分割処理とは異なり、これらの処理はコンテキストメニューから行うことにします。コンテキストメニューの項目からは、下記のコマンド (後述) を呼び出します。</p>
<ul>
<li>
	<p>パラグラフ: <code class=" db:literal ">to-para</code> コマンド</p>
</li>
<li>
	<p>プログラムリスト: <code class=" db:literal ">to-programlisting</code> コマンド</p>
</li>
</ul>
<pre class=" db:programlisting ">    :
&lt;xvcd:vocabulary match="db:article" call-template="root" name="db:article"&gt;
  <em>&lt;ui:ui xmlns:ui="http://xmlns.xfy.com/ui" version="1.0"&gt;
    &lt;ui:context-menu&gt;
      &lt;ui:menu-item label="パラグラフ" command="to-para"/&gt;
      &lt;ui:menu-item label="プログラムリスト" command="to-programlisting"/&gt;
    &lt;/ui:context-menu&gt;
  &lt;/ui:ui&gt;</em>
&lt;/xvcd:vocabulary&gt;
    :</pre>
<p>この XVCD スクリプトを XML 文書に適用すると、次のようにコンテキストメニューが表示されるようになります (が、コマンドが未定義なので、コンテキストメニューの項目は非活性状態になっています)。</p>
<p><a href="/shin_itani/memo/xfy/2006/10/01T231705/step01.png"><img alt="スクリーンショット (PNG 形式、約 44KB)" src="/shin_itani/memo/xfy/2006/10/01T231705/step01_thumbnail.png" /></a></p>
<p>次に、コンテキストメニューから呼び出されるコマンドを定義します。このコマンド中で、処理対象の要素 (= カレット位置の要素) の内容を新しい要素にコピーし、その要素で処理対象の要素を置き換えます。といっても、 XVCD には要素を置き換えるためのコマンドインストラクションが用意されていないので、要素の挿入 (<code class=" db:tag.element ">xvcd:insert</code> 要素) と要素の削除 (<code class=" db:tag.element ">xvcd:delete</code> 要素) とで代替します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:command name="<em>to-para</em>"&gt;
  &lt;inst:variable name="programlisting"
    select="xvcd:caret-node()/ancestor-or-self::db:programlisting[1]"/&gt;

  &lt;xvcd:insert ref="$programlisting" position="before"&gt;
    &lt;xvcd:element name="para" namespace="{namespace-uri($programlisting)}"&gt;
      &lt;xvcd:copy-of select="$programlisting/child::node()"/&gt;
    &lt;/xvcd:element&gt;
  &lt;/xvcd:insert&gt;
  &lt;xvcd:delete select="$programlisting"/&gt;
&lt;/xvcd:command&gt;
    :</pre>
<dl>
<dt>メモ</dt>
<dd>
	<p>新しい要素の挿入位置は、処理対象の要素の直前 (<code class=" db:tag.attribute ">position="before"</code>) が良いようです。処理対象の要素の直後に挿入すると (<code class=" db:tag.attribute ">position="after"</code>)、処理対象の要素を削除した際にカレットが消えて (どこかへいって ?) しまいます。</p>
</dd>
</dl>
<p>同様に、 <code class=" db:literal ">to-programlisting</code> コマンドも定義します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:command name="<em>to-programlisting</em>"&gt;
  &lt;inst:variable name="para"
    select="xvcd:caret-node()/ancestor-or-self::db:para[1]"/&gt;

  &lt;xvcd:insert ref="$para" position="before"&gt;
    &lt;xvcd:element name="programlisting" namespace="{namespace-uri($para)}"&gt;
      &lt;xvcd:copy-of select="$para/child::node()"/&gt;
    &lt;/xvcd:element&gt;
  &lt;/xvcd:insert&gt;
  &lt;xvcd:delete select="$para"/&gt;
&lt;/xvcd:command&gt;
    :</pre>
<p>この XVCD スクリプトを XML 文書に適用すると、次のように要素の種類を変更できるようになります。</p>
<p><a href="/shin_itani/memo/xfy/2006/10/01T231705/step02.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/10/01T231705/step02_thumbnail.png" /></a></p>

<h4><abbr title="User Interface">UI</abbr> の改善</h4>
<p>処理対象がパラグラフの場合、コンテキストメニューから選べるのは [プログラムリスト] だけであるべきです。同様に、処理対象がプログラムリストの場合、コンテキストメニューから選べるのは [パラグラフ] だけであるべきです。処理対象の要素に応じてコンテキストメニューの項目の状態 (活性、非活性) が変わるよう、 <abbr title="User Interface">UI</abbr> を改善します。</p>
<p>XVCD では、 <code class=" db:tag.element ">xvcd:command</code> 要素の <code class=" db:tag.attribute ">enabled</code> 属性値または要素の内容に応じて <abbr title="User Interface">UI</abbr> の活性、非活性が切り替わります。ここでは後者の方法を採り、 <code class=" db:tag.element ">xvcd:command</code> 要素中の <code class=" db:tag.element ">inst:variable</code> 要素を <code class=" db:tag.element ">inst:for-each</code> 要素に置き換えることにします。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:command name="to-para"&gt;
  <em>&lt;inst:for-each select="xvcd:caret-node()/ancestor-or-self::db:programlisting[1]"&gt;</em>
    &lt;xvcd:insert ref="<em>.</em>" position="before"&gt;
      &lt;xvcd:element name="para" namespace="{<em>namespace-uri()</em>}"&gt;
        &lt;xvcd:copy-of select="<em>child::node()</em>"/&gt;
      &lt;/xvcd:element&gt;
    &lt;/xvcd:insert&gt;
    &lt;xvcd:delete select="<em>.</em>"/&gt;
  <em>&lt;/inst:for-each&gt;</em>
&lt;/xvcd:command&gt;

&lt;xvcd:command name="to-programlisting"&gt;
  <em>&lt;inst:for-each select="xvcd:caret-node()/ancestor-or-self::db:para[1]"&gt;</em>
    &lt;xvcd:insert ref="<em>.</em>" position="before"&gt;
      &lt;xvcd:element name="programlisting" namespace="{<em>namespace-uri()</em>}"&gt;
        &lt;xvcd:copy-of select="<em>child::node()</em>"/&gt;
      &lt;/xvcd:element&gt;
    &lt;/xvcd:insert&gt;
    &lt;xvcd:delete select="<em>.</em>"/&gt;
  <em>&lt;/inst:for-each&gt;</em>
&lt;/xvcd:command&gt;
    :</pre>
<dl>
<dt>メモ</dt>
<dd>
	<p><code class=" db:tag.element">inst:for-each</code> 要素内では処理対象の要素がカレントノードになるので、 <code class=" db:tag.element ">xvcd:insert</code> 要素の <code class=" db:tag.attribute ">ref</code> 属性値や <code class=" db:tag.element ">xvcd:delete</code> 要素の <code class=" db:tag.attribute ">select</code> 属性値などの XPath 表記が簡潔になります。</p>
</dd>
</dl>
<p>この XVCD スクリプトを XML 文書に適用すると、次のようにコンテキストメニューの項目の活性、非活性が切り替わります。</p>
<p><a href="/shin_itani/memo/xfy/2006/10/01T231705/step03.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/10/01T231705/step03_thumbnail.png" /></a></p>

<h4>リファクタリング</h4>
<p>例によって記述の重複を避けるために、 <code class=" db:tag.element ">inst:for-each</code> 要素の内容を別コマンド (コマンド名: <code class=" db:literal ">replace-element</code>) として切り出します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:command name="<em>replace-element</em>"&gt;
  &lt;inst:param name="target"/&gt;
  &lt;inst:param name="with"/&gt;

  &lt;xvcd:insert ref="$target" position="before" select="$with"/&gt;
  &lt;xvcd:delete select="$target"/&gt;
&lt;/xvcd:command&gt;
    :</pre>
<p><code class=" db:literal ">replace-element</code> コマンドにはパラメータが二つ備わっています (パラメータ名: <code class=" db:literal ">target</code>、 <code class=" db:literal ">with</code>)。このコマンドを呼び出す際は、処理対象 (= 置き換え対象) の要素を <code class=" db:literal ">target</code> パラメータに、新しい要素を  <code class=" db:literal ">with</code> パラメータに、それぞれ指定して呼び出します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:command name="to-para"&gt;
  &lt;inst:for-each select="xvcd:caret-node()/ancestor-or-self::db:programlisting[1]"&gt;
    <em>&lt;inst:call name="replace-element"&gt;
      &lt;inst:with-param name="target" select="."/&gt;
      &lt;inst:with-param name="with"&gt;
        &lt;xvcd:element name="para" namespace="{namespace-uri()}"&gt;
          &lt;xvcd:copy-of select="child::node()"/&gt;
        &lt;/xvcd:element&gt;
      &lt;/inst:with-param&gt;
    &lt;/inst:call&gt;</em>
  &lt;/inst:for-each&gt;
&lt;/xvcd:command&gt;

&lt;xvcd:command name="to-programlisting"&gt;
  &lt;inst:for-each select="xvcd:caret-node()/ancestor-or-self::db:para[1]"&gt;
    <em>&lt;inst:call name="replace-element"&gt;
      &lt;inst:with-param name="target" select="."/&gt;
      &lt;inst:with-param name="with"&gt;
        &lt;xvcd:element name="programlisting" namespace="{namespace-uri()}"&gt;
          &lt;xvcd:copy-of select="child::node()"/&gt;
        &lt;/xvcd:element&gt;
      &lt;/inst:with-param&gt;
    &lt;/inst:call&gt;</em>
  &lt;/inst:for-each&gt;
&lt;/xvcd:command&gt;
    :</pre>

<h4>まとめ</h4>
<p>現時点での XVCD スクリプトです。</p>
<ul>
<li>
	<p><a href="http://homepage.mac.com/shin_itani/memo/xfy/2006/10/01T231705/article.xvcd" class=" db:uri ">http://homepage.mac.com/shin_itani/memo/xfy/2006/10/01T231705/article.xvcd</a></p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/10/01T231705.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/10/01T231705.html</guid>
         <category></category>
         <pubDate>Sun, 01 Oct 2006 23:17:05 +0900</pubDate>
      </item>
            <item>
         <title>DocBook 用のボキャブラリコンポーネントを作る (要素の挿入、分割、追加)</title>
         <description><![CDATA[<p>xfy Blog Editor のトライアル版がリリースされました。いろいろ試してみたいのですが、実験用サーバの構築や XML-RPC の勉強などに思うように時間を割けず、 xfy Blog Editor を試せるのはもう少し先になりそうです。<a href="http://www2.atwiki.jp/taox/pages/63.html#id_5596f1f1" title="xfy Blog Editor の発売アナウンス - 道仔@Wiki">コメントをいただいておきながら</a>申し訳ありません、 taox さん。</p>
<dl>
<dt>xfy Blog Editor (Trial) ダウンロード - xfy Community</dt>
<dd>
	<p><a href="https://www.xfytec.com/community/modules/newbb/viewtopic.php?topic_id=145&amp;forum=10" class=" db:uri ">https://www.xfytec.com/community/modules/newbb/viewtopic.php?topic_id=145&amp;forum=10</a></p>
</dd>
</dl>
<p>(こちらもなかなか思うように進みませんが) 引き続き、 DocBook 用のボキャブラリコンポーネントに手を加えていきます。</p>

<h4>現時点でのボキャブラリコンポーネントの外部仕様</h4>
<p>DocBook 用のボキャブラリコンポーネントとして、下記の機能を実装します。</p>
<ul>
<li>
	<p>各要素が表示される (実装済み)。</p>
</li>
<li>
	<p>各要素の内容 (テキストノード) を編集できる (実装済み)。</p>
</li>
<li>
	<p>要素が空要素用の場合 → プレースホルダを示す文字列が表示される (実装済み)。</p>
</li>
<li>
	<p>カレット位置に応じて要素の挿入、分割、追加ができる。</p>
</li>
</ul>


<h4>カレット位置に応じて要素を挿入、分割、追加する</h4>
<p>パラグラフの前後に新しいパラグラフを挿入したり追加したりできるようにします。また、パラグラフをカレット位置で分割できるようにします。</p>
<p>XML エディタの中には、要素の挿入や追加などをメニュー (コンテキストメニューを含む) から行うものがあります。しかし、このボキャブラリコンポーネントでは、ワードプロセッサに似た使い勝手を実現したいので、これらの処理を Enter キーの押下で行うことにします。 Enter キー押下時の挙動は下記のとおりです。</p>
<ul>
<li>
	<p>カレットがパラグラフの先頭にある場合 → そのパラグラフの直前に空のパラグラフを挿入する。</p>
</li>
<li>
	<p>カレットがパラグラフの途中にある場合 → そのパラグラフをカレット位置で分割する。</p>
</li>
<li>
	<p>カレットがパラグラフの末尾にある場合 → そのパラグラフの直後に空のパラグラフを追加する。</p>
</li>
</ul>
<p>これらの処理は、要素の分割処理だけで実現できます。なお、併せてパラグラフの末尾に段落記号 (<code class=" db:literal ">¶</code>) を表示することにします。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:xvcd version="1.0"
  xmlns:xvcd  = "http://xmlns.xfy.com/xvcd"
  <em>xmlns:event = "http://xmlns.xfy.com/event"</em>
  xmlns:db    = "http://docbook.org/ns/docbook"
  xmlns:h     = "http://www.w3.org/1999/xhtml"&gt;
      :
  &lt;xvcd:template match="db:para"&gt;
    &lt;h:p&gt;
      &lt;xvcd:call-template name="apply-templates.with-filler"&gt;
        &lt;xvcd:with-param name="filler" select="'パラグラフ'"/&gt;
      &lt;/xvcd:call-template&gt;
      <em>&lt;h:small class=" pilcrow-sign "&gt;¶&lt;/h:small&gt;
      &lt;xvcd:action event="event:key-pressed[@stroke = 'ENTER']"&gt;
        &lt;xvcd:split select="."/&gt;
      &lt;/xvcd:action&gt;</em>
    &lt;/h:p&gt;
  &lt;/xvcd:template&gt;
      :
&lt;/xvcd:xvcd&gt;</pre>
<p>同様の変更をプログラムリスト用のテンプレートにも施します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:template match="db:programlisting"&gt;
  &lt;h:pre&gt;
    &lt;xvcd:call-template name="apply-templates.with-filler"&gt;
      &lt;xvcd:with-param name="filler" select="'プログラムリスト'"/&gt;
    &lt;/xvcd:call-template&gt;
    <em>&lt;h:small class=" pilcrow-sign "&gt;¶&lt;/h:small&gt;
    &lt;xvcd:action event="event:key-pressed[@stroke = 'ENTER']"&gt;
      &lt;xvcd:split select="."/&gt;
    &lt;/xvcd:action&gt;</em>
  &lt;/h:pre&gt;
&lt;/xvcd:template&gt;
    :</pre>
<p>この XVCD スクリプトを XML 文書に適用すると、次のようになります。</p>
<p><a href="/shin_itani/memo/xfy/2006/09/11T224359/step01.png"><img alt="スクリーンショット (PNG 形式、約 44KB)" src="/shin_itani/memo/xfy/2006/09/11T224359/step01_thumbnail.png" /></a></p>

<h4>リファクタリング</h4>
<p>例によって記述の重複を避けるために、追加したばかりの <code class=" db:tag.element ">h:small</code> 要素と <code class=" db:tag.element ">xvcd:action</code> 要素とをそれぞれ名前付きテンプレート (テンプレート名: <code class=" db:literal ">pilcrow-sign</code>、 <code class=" db:literal ">action.key-pressed.ENTER.then-split</code>) として切り出します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:template name="<em>pilcrow-sign</em>"&gt;
  &lt;h:small class=" pilcrow-sign "&gt;¶&lt;/h:small&gt;
&lt;/xvcd:template&gt;

&lt;xvcd:template name="<em>action.key-pressed.ENTER.then-split</em>"&gt;
  &lt;xvcd:action event="event:key-pressed[@stroke = 'ENTER']"&gt;
    &lt;xvcd:split select="."/&gt;
  &lt;/xvcd:action&gt;
&lt;/xvcd:template&gt;
    :</pre>
<p>これらのテンプレートには、パラメータは特に備わっていません。これらのテンプレートを呼び出す際は、そのまま呼び出します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:template match="db:para"&gt;
  &lt;h:p&gt;
    &lt;xvcd:call-template name="apply-templates.with-filler"&gt;
      &lt;xvcd:with-param name="filler" select="'パラグラフ'"/&gt;
    &lt;/xvcd:call-template&gt;
    <em>&lt;xvcd:call-template name="pilcrow-sign"/&gt;
    &lt;xvcd:call-template name="action.key-pressed.ENTER.then-split"/&gt;</em>
  &lt;/h:p&gt;
&lt;/xvcd:template&gt;

&lt;xvcd:template match="db:programlisting"&gt;
  &lt;h:pre&gt;
    &lt;xvcd:call-template name="apply-templates.with-filler"&gt;
      &lt;xvcd:with-param name="filler" select="'プログラムリスト'"/&gt;
    &lt;/xvcd:call-template&gt;
    <em>&lt;xvcd:call-template name="pilcrow-sign"/&gt;
    &lt;xvcd:call-template name="action.key-pressed.ENTER.then-split"/&gt;</em>
  &lt;/h:pre&gt;
&lt;/xvcd:template&gt;
    :</pre>

<h4>まとめ</h4>
<p>現時点での XVCD スクリプトです。</p>
<ul>
<li>
	<p><a href="http://homepage.mac.com/shin_itani/memo/xfy/2006/09/11T224359/article.xvcd" class=" db:uri ">http://homepage.mac.com/shin_itani/memo/xfy/2006/09/11T224359/article.xvcd</a></p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/09/11T224359.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/09/11T224359.html</guid>
         <category></category>
         <pubDate>Mon, 11 Sep 2006 22:43:59 +0900</pubDate>
      </item>
            <item>
         <title>DocBook 用のボキャブラリコンポーネントを作る (空要素用のプレースホルダ)</title>
         <description><![CDATA[<p>引き続き、 DocBook 用のボキャブラリコンポーネントに手を加えていきます。</p>

<h4>現時点でのボキャブラリコンポーネントの外部仕様</h4>
<p>DocBook 用のボキャブラリコンポーネントとして、下記の機能を実装します。</p>
<ul>
<li>
	<p>各要素が表示される (実装済み)。</p>
</li>
<li>
	<p>各要素の内容 (テキストノード) を編集できる (実装済み)。</p>
</li>

<li>
	<p>要素が空要素用の場合 → プレースホルダを示す文字列が表示される。</p>
</li>
</ul>

<h4>空要素用のプレースホルダを表示する</h4>
<p>空要素用のプレースホルダを表示するために、各 <code class=" db:tag.element ">xvcd:apply-templates</code> 要素内に <code class=" db:tag.element ">xvcd:filler</code> 要素を記述します。プレースホルダには、下記の文字列を表示します。</p>
<ul>
<li>
	<p>文書のタイトル (<code class=" db:tag.element ">db:title</code> 要素): <code class=" db:literal ">タイトル</code></p>
</li>
<li>
	<p>パラグラフ (<code class=" db:tag.element ">db:para</code> 要素): <code class=" db:literal ">パラグラフ</code></p>
</li>
<li>
	<p>プログラムリスト (<code class=" db:tag.element ">db:programlisting</code> 要素): <code class=" db:literal ">プログラムリスト</code></p>
</li>
</ul>
<pre class=" db:programlisting ">    :
&lt;xvcd:template match="db:title"&gt;
  &lt;h:h1&gt;
    &lt;xvcd:apply-templates&gt;
      <em>&lt;xvcd:filler&gt;
        &lt;h:var class=" xvcd:filler "&gt;
          &lt;xvcd:text-of select="." filler="タイトル"/&gt;
        &lt;/h:var&gt;
      &lt;/xvcd:filler&gt;</em>
    &lt;/xvcd:apply-templates&gt;
  &lt;/h:h1&gt;
&lt;/xvcd:template&gt;

&lt;xvcd:template match="db:para"&gt;
  &lt;h:p&gt;
    &lt;xvcd:apply-templates&gt;
      <em>&lt;xvcd:filler&gt;
        &lt;h:var class=" xvcd:filler "&gt;
          &lt;xvcd:text-of select="." filler="パラグラフ"/&gt;
        &lt;/h:var&gt;
      &lt;/xvcd:filler&gt;</em>
    &lt;/xvcd:apply-templates&gt;
  &lt;/h:p&gt;
&lt;/xvcd:template&gt;

&lt;xvcd:template match="db:programlisting"&gt;
  &lt;h:pre&gt;
    &lt;xvcd:apply-templates&gt;
      <em>&lt;xvcd:filler&gt;
        &lt;h:var class=" xvcd:filler "&gt;
          &lt;xvcd:text-of select="." filler="プログラムリスト"/&gt;
        &lt;/h:var&gt;
      &lt;/xvcd:filler&gt;</em>
    &lt;/xvcd:apply-templates&gt;
  &lt;/h:pre&gt;
&lt;/xvcd:template&gt;
    :</pre>
<p>また、プレースホルダ用のスタイル定義 (下記) を追加します。</p>
<ul>
<li>
	<p>文字色: 78% のグレー</p>
</li>
<li>
	<p>背景色: 99% のグレー</p>
</li>
</ul>
<p>この XVCD スクリプトを前述の XML 文書に適用すると、次のようになります。</p>
<p><a href="/shin_itani/memo/xfy/2006/08/26T001109/step01.png"><img alt="スクリーンショット (PNG 形式、約 32KB)" src="/shin_itani/memo/xfy/2006/08/26T001109/step01_thumbnail.png" /></a></p>

<h4>リファクタリング</h4>
<p>上記で <code class=" db:tag.element ">xvcd:filler</code> 要素を追加した <code class=" db:tag.element ">xvcd:apply-templates</code> 要素群は、 (<code class=" db:tag.element ">xvcd:text-of</code> 要素の <code class=" db:tag.attribute ">filler</code> 属性値を除いて) すべて同じ構造をしています。記述の重複を避けるために、これらの <code class=" db:tag.element ">xvcd:apply-templates</code> 要素を名前付きテンプレート (テンプレート名: <code class=" db:literal ">apply-templates.with-filler</code>) として切り出します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:template name="<em>apply-templates.with-filler</em>"&gt;
  &lt;xvcd:param name="filler"/&gt;

  &lt;xvcd:apply-templates&gt;
    &lt;xvcd:filler&gt;
      &lt;h:var class=" xvcd:filler "&gt;
        &lt;xvcd:text-of select="."&gt;
          &lt;xvcd:filler&gt;
            &lt;xvcd:value-of select="$filler"/&gt;
          &lt;/xvcd:filler&gt;
        &lt;/xvcd:text-of&gt;
      &lt;/h:var&gt;
    &lt;/xvcd:filler&gt;
  &lt;/xvcd:apply-templates&gt;
&lt;/xvcd:template&gt;
    :</pre>
<p><code class=" db:literal ">apply-templates.with-filler</code> テンプレートにはパラメータが一つ備わっています (パラメータ名: <code class=" db:literal ">filler</code>)。このテンプレートを呼び出す際は、プレースホルダに表示したい文字列を <code class=" db:literal ">filler</code> パラメータに指定して呼び出します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:template match="db:title"&gt;
  &lt;h:h1&gt;
    <em>&lt;xvcd:call-template name="apply-templates.with-filler"&gt;
      &lt;xvcd:with-param name="filler" select="'タイトル'"/&gt;
    &lt;/xvcd:call-template&gt;</em>
  &lt;/h:h1&gt;
&lt;/xvcd:template&gt;

&lt;xvcd:template match="db:para"&gt;
  &lt;h:p&gt;
    <em>&lt;xvcd:call-template name="apply-templates.with-filler"&gt;
      &lt;xvcd:with-param name="filler" select="'パラグラフ'"/&gt;
    &lt;/xvcd:call-template&gt;</em>
  &lt;/h:p&gt;
&lt;/xvcd:template&gt;

&lt;xvcd:template match="db:programlisting"&gt;
  &lt;h:pre&gt;
    <em>&lt;xvcd:call-template name="apply-templates.with-filler"&gt;
      &lt;xvcd:with-param name="filler" select="'プログラムリスト'"/&gt;
    &lt;/xvcd:call-template&gt;</em>
  &lt;/h:pre&gt;
&lt;/xvcd:template&gt;
    :</pre>

<h4>まとめ</h4>
<p>現時点での XVCD スクリプトです。</p>
<ul>
<li>
	<p><a href="http://homepage.mac.com/shin_itani/memo/xfy/2006/08/26T001109/article.xvcd" class=" db:uri ">http://homepage.mac.com/shin_itani/memo/xfy/2006/08/26T001109/article.xvcd</a></p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/08/26T001109.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/08/26T001109.html</guid>
         <category></category>
         <pubDate>Sat, 26 Aug 2006 00:11:09 +0900</pubDate>
      </item>
            <item>
         <title>DocBook 用のボキャブラリコンポーネントを作る (はじめに)</title>
         <description><![CDATA[<p>XVCD の理解を深めるために、 (DocBook の勉強も兼ねて) DocBook 用のボキャブラリコンポーネントを XVCD で作ってみようと思います。といっても、いきなり DocBook の仕様すべてをサポートするようなボキャブラリコンポーネントを作るのは大変なので、まずは DocBook のサブセットとなる簡易的な XML ボキャブラリを想定し、それをサポートすることを目指します。</p>
<dl>
<dt>補足</dt>
<dd>
	<p>今までは<em>〜用の XVCD を作る</em>という表現を用いてきましたが、今後は<em>〜用のボキャブラリコンポーネントを XVCD で作る</em>という表現を用います。これは、 2 種類のボキャブラリコンポーネント (「VC デスティネーション用のボキャブラリコンポーネント」と「ボキャブラリコネクションで実現したボキャブラリコンポーネント」) の違いを明確にするためです。</p>
</dd>
</dl>

<h4>現時点で想定する XML ボキャブラリ</h4>
<p>DocBook のサブセットとして、下記の XML ボキャブラリを想定します。</p>
<ul>
<li>
	<p>XML 文書の構造は、単一かつ単階層のセクション構造とする。複数階層 (章、節、項など) のセクション構造は持たない。</p>
</li>
<li>
	<p>セクションは、タイトル、パラグラフ、プログラムリスト (特殊なパラグラフ) で構成される。リストや図、表などは含まない。</p>
</li>
<li>
	<p>タイトル、パラグラフ、プログラムリストは、内容としてテキストだけを持つ。インライン要素はいっさい持たない。</p>
</li>
<li>
	<p>メタ情報用の要素はいっさい考慮しない。属性も、 DocBook のバージョンを示すためのものだけとする。</p>
</li>
<li>
	<p>名前空間 URI は、 <a href="http://docbook.org/schemas/5x" title="DocBook V5.x - docbook.org">DocBook V5.0 (2006-08-24 現在、ワーキングドラフト)</a> のものを使う。</p>
</li>
</ul>
<dl>
<dt>上記 XML ボキャブラリのスキーマ</dt>
<dd>
	<p><a href="/shin_itani/memo/xfy/2006/08/24T233456/article.rng">RELAX NG スキーマ (約 1.2KB)</a>、 <a href="/shin_itani/memo/xfy/2006/08/24T233456/article.dtd">XML DTD (1KB 以下)</a></p>
</dd>
<dt>上記 XML ボキャブラリでマークアップされた XML 文書の例</dt>
<dd>
	<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;article xmlns="http://docbook.org/ns/docbook" version="5.0"&gt;
  &lt;title&gt;<var class=" db:replaceable ">文書のタイトル (title)</var>&lt;/title&gt;
  &lt;para&gt;<var class=" db:replaceable ">パラグラフ (paragraph)</var>&lt;/para&gt;
  &lt;programlisting&gt;<var class=" db:replaceable ">プログラムリスト (program listing)</var>&lt;/programlisting&gt;
&lt;/article&gt;</pre>
</dd>
</dl>

<h4>現時点でのボキャブラリコンポーネントの外部仕様</h4>
<p>この XML ボキャブラリに対し、下記の機能を実装します。</p>
<ul>
<li>
	<p>各要素が表示される。</p>
</li>
<li>
	<p>各要素の内容 (テキストノード) を編集できる。</p>
</li>
</ul>

<h4>各要素を表示する</h4>
<p>まず、各要素を表示するために、ルートテンプレートと要素ノード用のテンプレート (4 種類) とを定義します。要素ノード用のテンプレートでは、次のように DocBook の各要素を XHTML の各要素にマッピングしています。</p>
<ul>
<li>
	<p><code class=" db:tag.element ">db:article</code> → <code class=" db:tag.element ">h:html</code> + <code class=" db:tag.element ">h:body</code></p>
</li>
<li>
	<p><code class=" db:tag.element ">db:title</code> → <code class=" db:tag.element ">h:h1</code></p>
</li>
<li>
	<p><code class=" db:tag.element ">db:para</code> → <code class=" db:tag.element ">h:p</code></p>
</li>
<li>
	<p><code class=" db:tag.element ">db:programlisting</code> → <code class=" db:tag.element ">h:pre</code></p>
</li>
</ul>
<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;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"&gt;

  &lt;xvcd:vocabulary match="db:article" call-template="root" name="db:article"/&gt;

  &lt;xvcd:template name="root"&gt;
    &lt;xvcd:apply-templates select="."/&gt;
  &lt;/xvcd:template&gt;

  &lt;xvcd:template match="db:article"&gt;
    &lt;h:html&gt;
      &lt;h:body&gt;
        &lt;xvcd:apply-templates select="child::db:*"/&gt;
      &lt;/h:body&gt;
    &lt;/h:html&gt;
  &lt;/xvcd:template&gt;

  &lt;xvcd:template match="db:title"&gt;
    &lt;h:h1&gt;
      &lt;xvcd:apply-templates/&gt;
    &lt;/h:h1&gt;
  &lt;/xvcd:template&gt;

  &lt;xvcd:template match="db:para"&gt;
    &lt;h:p&gt;
      &lt;xvcd:apply-templates/&gt;
    &lt;/h:p&gt;
  &lt;/xvcd:template&gt;

  &lt;xvcd:template match="db:programlisting"&gt;
    &lt;h:pre&gt;
      &lt;xvcd:apply-templates/&gt;
    &lt;/h:pre&gt;
  &lt;/xvcd:template&gt;

&lt;/xvcd:xvcd&gt;</pre>
<p>この XVCD スクリプトを前述の XML 文書に適用すると、次のようになります。</p>
<p><a href="/shin_itani/memo/xfy/2006/08/24T233456/step01.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/08/24T233456/step01_thumbnail.png" /></a></p>

<h4>各要素の内容 (テキストノード) を編集できるようにする</h4>
<p>次に、各要素の内容 (テキストノード) を編集できるようにするために、テキストノード用のテンプレートを追加します。</p>
<pre class=" db:programlisting ">    :
&lt;xvcd:template match="text()"&gt;
  &lt;xvcd:text-of select="."/&gt;
&lt;/xvcd:template&gt;
    :</pre>
<p>また、見栄えを整えるためにスタイル定義 (下記) を追加します。</p>
<dl>
<dt>全体</dt>
<dd>
	<ul>
	<li>
		<p>行間: 1/3 行分</p>
	</li>
	</ul>
</dd>
<dt>文書のタイトル</dt>
<dd>
	<ul>
	<li>
		<p>段落前の余白: 1 行分</p>
	</li>
	<li>
		<p>段落後の余白: 1/2 行分</p>
	</li>
	<li>
		<p>下ボーダー: 1/10 文字分、 60% のグレー、実線</p>
	</li>
	<li>
		<p>文字サイズ: 本文の 1.73 倍 (= 1.2 倍 * 1.2 倍 * 1.2 倍)</p>
	</li>
	<li>
		<p>文字位置: 右寄せ</p>
	</li>
	</ul>
</dd>
<dt>パラグラフ</dt>
<dd>
	<ul>
	<li>
		<p>段落前の余白: なし</p>
	</li>
	<li>
		<p>段落後の余白: 1 行分</p>
	</li>
	</ul>
</dd>
<dt>プログラムリスト</dt>
<dd>
	<ul>
	<li>
		<p>段落前の余白: なし</p>
	</li>
	<li>
		<p>段落後の余白: 1 行分</p>
	</li>
	<li>
		<p>上下のパディング: 1/4 行分</p>
	</li>
	<li>
		<p>左右のパディング: 3/4 文字分</p>
	</li>
	<li>
		<p>左ボーダー: 1/4 文字分、 60% のグレー、実線</p>
	</li>
	<li>
		<p>背景色: 93% のグレー</p>
	</li>
	</ul>
</dd>
</dl>
<p>この XVCD スクリプトを前述の XML 文書に適用すると、次のようになります。</p>
<p><a href="/shin_itani/memo/xfy/2006/08/24T233456/step02.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/08/24T233456/step02_thumbnail.png" /></a></p>

<h4>まとめ</h4>
<p>現時点での XVCD スクリプトです。</p>
<ul>
<li>
	<p><a href="http://homepage.mac.com/shin_itani/memo/xfy/2006/08/24T233456/article.xvcd" class=" db:uri ">http://homepage.mac.com/shin_itani/memo/xfy/2006/08/24T233456/article.xvcd</a></p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/08/24T233456.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/08/24T233456.html</guid>
         <category></category>
         <pubDate>Thu, 24 Aug 2006 23:34:56 +0900</pubDate>
      </item>
            <item>
         <title>Unknown XVCD (xfy Basic Edition 1.3 用)</title>
         <description><![CDATA[<p>やっと自宅のネットワーク環境が復活しました。 xfy Basic Edition 1.3 がリリースされてから少し経ってしまいましたが、 <a href="/shin_itani/memo/xfy/2006/03/15T214550.html" title="未知の XML ボキャブラリ用の XVCD - xfy.memo">Unknown XVCD</a> を xfy Basic Edition 1.3 用に改訂しました。</p>
<dl>
<dt>Unknown XVCD</dt>
<dd>
	<p><a href="http://homepage.mac.com/shin_itani/xvcd/2006-08-21/unknown.xvcd" class=" db:uri ">http://homepage.mac.com/shin_itani/xvcd/2006-08-21/unknown.xvcd</a></p>
</dd>
</dl>

<h4>変更内容</h4>
<dl>
<dt><code class=" db:tag.element ">h:html</code> 要素のスタイル指定 (<code class=" db:property ">height</code> プロパティ) を削除しました。</dt>
<dd>
	<p>xfy Basic Edition 1.3 Beta までは、未知の XML ボキャブラリ (でマークアップされた部分) のレンダリング領域が間延びしてしまうのを防ぐために、 <code class=" db:tag.element ">h:html</code> 要素のスタイル指定 (<code class=" db:property ">height</code> プロパティ) が必要でした。 xfy Basic Edition 1.3 からは、その必要がなくなった模様です。</p>
</dd>
<dt>テキストノードの値がプレーンテキストとして扱われるよう、データ型 (<code class=" db:literal ">xvcd:plain-text</code>) を明示しました。</dt>
<dd>
	<p>xfy Basic Edition 1.3 Beta までは、テキストノードの値をプレーンテキストとして扱えなかった (?) ので、空白類文字だけから成るテキストノードが正しく出力されませんでした (<code class=" db:tag.attribute ">filler</code> 属性値または <code class=" db:tag.element ">xvcd:filler</code> 要素の内容が出力されてしまう)。 xfy Basic Edition 1.3 からは、<a href="http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/spec/reference_xvcd.html#plain-text" title="VC 中核リファレンス : 要素・属性編 - xfy.com">データ型としてプレーンテキスト型 (<code class=" db:literal ">xvcd:plain-text</code>) を明示できるようになった</a>ので、空白類文字だけから成るテキストノードが正しく出力されるようになりました。</p>
</dd>
</dl>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/08/21T215643.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/08/21T215643.html</guid>
         <category></category>
         <pubDate>Mon, 21 Aug 2006 21:56:43 +0900</pubDate>
      </item>
            <item>
         <title>初、表参道</title>
         <description><![CDATA[<p>DB2 Viper ☆ Star Festival に参加してきました。お目当ては xfy の話だったのですが、 DB2 9 (コードネーム「DB2 Viper」) もとても興味深い製品でした。</p>
<dl>
<dt>DB2 Viper ☆ Star Festival - ibm.com</dt>
<dd>
	<p><a href="http://www-06.ibm.com/jp/software/data/events/viper/" class=" db:uri ">http://www-06.ibm.com/jp/software/data/events/viper/</a></p>
</dd>
</dl>

<h4>DB2 Viper テクニカル・セミナーでの xfy の話</h4>
<p><a href="http://www-06.ibm.com/jp/software/data/events/viper/techseminar.html" title="DB2 Viper テクニカル・セミナー - ibm.com">DB2 Viper テクニカル・セミナー</a>では、 xfy Enterprise Solution 1.0 の製品コンセプトやビジネスソリューションへの取り組みなどが紹介されました。また、 xfy Enterprise Solution 1.0 + DB2 9 なアプリケーションのデモも実演されました。デモの内容は、 xfy.com で公開されている<a href="http://www.xfy.com/tour/demos/db2.html" title="DB2 Viper Extension Kit for xfy Enterprise Solution 1.0 - xfy.com">デモムービー</a>の内容とほぼ同じでした。</p>

<h4>Viper Night での xfy の話</h4>
<p><a href="http://www-06.ibm.com/jp/software/data/events/viper/vipernight.html" title="Viper Night - ibm.com">Viper Night</a> では、和やかな雰囲気の中、 xfy 誕生の経緯や IBM との提携のきっかけなどが述べられました。後半は、デモ展示コーナーにいらしたジャストシステムの担当の方々とずっと話していました。 :-)</p>

<h4>AVC (アダプティブボキャブラリコンポーネント ?)</h4>
<p>現在提供されている「特定の XML ボキャブラリ (= XHTML や SVG など) 用のボキャブラリコンポーネント」に加え、「汎用的なボキャブラリコンポーネント (AVC)」が提供されるそうです。この AVC によって、 (データベースへの問い合わせ結果や Web サービスのレスポンスなどの) 未知の XML ボキャブラリをそれなりにハンドリングできるようになるとのことです。<a href="http://www.xfy.com/jp/products/db2.pdf">カタログ (PDF 形式、約 1.9MB)</a> によると、 xfy Enterprise Solution Plus for DB2 9 では下記の AVC が提供されるようです。</p>
<dl>
<dt>Adaptive Data Grid component for xfy</dt>
<dd>
	<p><a href="http://www.xfy.com/tour/demos/db2.html" title="DB2 Viper Extension Kit for xfy Enterprise Solution 1.0 - xfy.com">デモムービー</a>中で [XMLDB] - [Change view] - [Table] を選んだ際に適用されるボキャブラリコンポーネントだと思われます。</p>
</dd>
<dt>Adaptive XY Chart component for xfy</dt>
<dd>
	<p><a href="http://www.xfy.com/tour/demos/db2.html" title="DB2 Viper Extension Kit for xfy Enterprise Solution 1.0 - xfy.com">デモムービー</a>中で [XMLDB] - [Change view] - [Map] を選んだ際に適用されるボキャブラリコンポーネントだと思われます。</p>
</dd>
</dl>

<h4>その他</h4>
<ul>
<li>
	<p>ボキャブラリコンポーネントとボキャブラリコネクションとをきちんと区別した方が良さそうです。</p>
</li>
<li>
	<p>イベント当日 (7 月 7 日) はジャストシステムの創立記念日だったそうです。</p>
</li>
<li>
	<p>表参道ヒルズの「天の川」を見そびれました……</p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/07/09T224227.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/07/09T224227.html</guid>
         <category></category>
         <pubDate>Sun, 09 Jul 2006 22:42:27 +0900</pubDate>
      </item>
            <item>
         <title>「文書系 XML ボキャブラリ用 XVCD」のための XVCD スクリプトモジュール</title>
         <description><![CDATA[<p>「(DocBook や DITA などの) 文書系 XML ボキャブラリ用 XVCD」の作成に便利な XVCD スクリプトモジュール「_default モジュール」を作ってみました。</p>
<dl>
<dt>_default モジュール</dt>
<dd>
	<p><a href="http://homepage.mac.com/shin_itani/xvcd/2006-06-20/_default.module" class=" db:uri ">http://homepage.mac.com/shin_itani/xvcd/2006-06-20/_default.module</a></p>
</dd>
</dl>

<h4>背景</h4>
<p>文書系の XML ボキャブラリ用の XVCD スクリプトを作る場合、 (同類の XSLT スタイルシートを作る場合と同様に) <a href="http://www-06.ibm.com/jp/developerworks/xml/020726/j_x-xdpshpul.html" title="データ用の XML: XSL スタイル・シート: プッシュ・スタイルかプル・スタイルか ? - ibm.com"><em>プッシュスタイル</em>で作ることが多い</a>と思います。プッシュスタイルでは、必要に応じて要素ごとにテンプレートを追加していくので、処理済みの要素と未処理の要素とを視覚的に判別できると便利です。</p>

<h4>_default モジュールの構造</h4>
<p>_default モジュールは、 XVCD スクリプトに不可欠 (にもかかわらず内容が割と定型的) なルートテンプレートと、 2 種類の要素ノード用テンプレートとで構成されています。</p>
<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;xvcd:xvcd xmlns:xvcd="http://xmlns.xfy.com/xvcd" version="1.0"&gt;

  <code class=" db:tag.comment ">&lt;!-- ルートテンプレート --&gt;</code>
  &lt;xvcd:template name="_default.root"&gt;
    &lt;xvcd:apply-templates select="."/&gt;
  &lt;/xvcd:template&gt;

  <code class=" db:tag.comment ">&lt;!-- 要素ノード用テンプレート (ルート要素用) --&gt;</code>
  &lt;xvcd:template match="*[not(parent::*)]"&gt;
    &lt;h:html xmlns:h="http://www.w3.org/1999/xhtml"&gt;
      &lt;h:body&gt;
        &lt;xvcd:next-match/&gt;
      &lt;/h:body&gt;
    &lt;/h:html&gt;
  &lt;/xvcd:template&gt;

  <code class=" db:tag.comment ">&lt;!-- 要素ノード用テンプレート --&gt;</code>
  &lt;xvcd:template match="*"&gt;
    &lt;xvcd:variable name="attributes"&gt;
      &lt;xvcd:for-each select="@*"&gt;
        &lt;xvcd:value-of select="concat(' ', name(), '=', '&amp;quot;', ., '&amp;quot;')"/&gt;
      &lt;/xvcd:for-each&gt;
    &lt;/xvcd:variable&gt;

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

&lt;/xvcd:xvcd&gt;</pre>
<dl>
<dt>ルートテンプレート</dt>
<dd>
	<p>モジュールを利用する側の XVCD スクリプトから (<a href="http://www.xfy.com/ja/manual/app/developer/1.0/spec/reference_xvcd.html#vocabulary" title="VC 中核リファレンス - xfy.com"><code class=" db:tag.element ">xvcd:vocabulary</code> 要素</a>経由で) 呼び出されます。カレントノード (= ルート要素) にテンプレートを適用しているだけです。</p>
</dd>
<dt>要素ノード用テンプレート (ルート要素用)</dt>
<dd>
	<p>当該 XML ボキャブラリを XHTML にマッピングするために <code class=" db:tag.element ">h:html</code> 要素と <code class=" db:tag.element ">h:body</code> 要素とを出力した上で、カレントノード (= ルート要素) に<em>要素ノード用テンプレート</em> (後述) を適用しています。このテンプレートは、モジュールを利用する側の XVCD スクリプト中で上書きされることを想定しています。</p>
</dd>
<dt>要素ノード用テンプレート</dt>
<dd>
	<p>要素ノードの情報 (要素名や属性など) をタグ形式で出力しています。要素ノードが子ノードを持つ場合は「開始タグ + 要素の内容 + 終了タグ」として出力し、要素ノードが子ノードを持たない場合 (= 空要素の場合) は「空要素タグ」として出力します。このテンプレートも、モジュールを利用する側の XVCD スクリプト中で上書きされることを想定しています。</p>
</dd>
</dl>

<h4>_default モジュールを使った XVCD スクリプトの作成例</h4>
<p>実際に _default モジュールを使って、とある DocBook 文書 (下記) 用の XVCD スクリプトを作ってみました。</p>
<dl>
<dt>Customizing DocBook - DocBook 5.0: The Definitive Guide</dt>
<dd>
	<p><a href="http://svn.sourceforge.net/viewcvs.cgi/*checkout*/docbook/trunk/defguide5/en/src/ch05.xml" class=" db:uri ">http://svn.sourceforge.net/viewcvs.cgi/*checkout*/docbook/trunk/defguide5/en/src/ch05.xml</a></p>
</dd>
</dl>

<ol>
<li>
	<p>最初に、 XVCD スクリプトに _default モジュールをインポートし、ルートテンプレートを呼び出します。</p>
	<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;xvcd:xvcd version="1.0"
 xmlns:xvcd = "http://xmlns.xfy.com/xvcd"
 xmlns:db   = "http://docbook.org/ns/docbook"&gt;

  <em>&lt;xvcd:import href="./_default.module"/&gt;</em>

  &lt;xvcd:vocabulary match="db:*" call-template="<em>_default.root</em>" name="Chapter"/&gt;

&lt;/xvcd:xvcd&gt;</pre>
	<p>この XVCD スクリプトを DocBook 文書に適用すると、 (次のように) すべてのタグが視覚化されます。</p>
	<p><a href="/shin_itani/memo/xfy/2006/06/20T212153/step01.png"><img alt="スクリーンショット (PNG 形式、約 56KB)" src="/shin_itani/memo/xfy/2006/06/20T212153/step01_thumbnail.png" /></a></p>
	<p>これで、プッシュスタイルでテンプレートを追加していく準備が整いました。</p>
</li>
<li>
	<p>手始めに、 (パラグラフをあらわす) <a href="http://docbook.org/tdg5/en/html/para.html" title="para - DocBook: The Definitive Guide - docbook.org"><code class=" db:tag.element ">db:para</code> 要素</a>用のテンプレートを追加し、文章のアウトラインを把握しやすくします。</p>
	<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;xvcd:xvcd version="1.0"
 xmlns:xvcd = "http://xmlns.xfy.com/xvcd"
 xmlns:db   = "http://docbook.org/ns/docbook"
 <em>xmlns:h    = "http://www.w3.org/1999/xhtml"</em>&gt;

  &lt;xvcd:import href="./_default.module"/&gt;

  &lt;xvcd:vocabulary match="db:*" call-template="_default.root" name="Chapter"/&gt;

  <em>&lt;xvcd:template match="db:para"&gt;
    &lt;h:p&gt;
      &lt;xvcd:apply-templates/&gt;
    &lt;/h:p&gt;
  &lt;/xvcd:template&gt;</em>

&lt;/xvcd:xvcd&gt;</pre>
	<p>この XVCD スクリプトを DocBook 文書に適用すると、 (次のように) <a href="http://docbook.org/tdg5/en/html/para.html" title="para - DocBook: The Definitive Guide - docbook.org"><code class=" db:tag.element ">db:para</code> 要素</a>がブロックレベル要素として表示されるようになり、文章のアウトラインが把握しやすくなります。</p>
	<p><a href="/shin_itani/memo/xfy/2006/06/20T212153/step02.png"><img alt="スクリーンショット (PNG 形式、約 48KB)" src="/shin_itani/memo/xfy/2006/06/20T212153/step02_thumbnail.png" /></a></p>
</li>
<li>
	<p>次に、 (索引用のメタ情報をあらわす) <a href="http://docbook.org/tdg5/en/html/indexterm.singular.html" title="indexterm (db.indexterm.singular) - DocBook: The Definitive Guide - docbook.org"><code class=" db:tag.element ">db:indexterm</code> 要素</a>用のテンプレートを追加し、全体の見通しを良くします。</p>
	<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;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"&gt;

  &lt;xvcd:import href="./_default.module"/&gt;

  &lt;xvcd:vocabulary match="db:*" call-template="_default.root" name="Chapter"/&gt;

  &lt;xvcd:template match="db:para"&gt;
    &lt;h:p&gt;
      &lt;xvcd:apply-templates/&gt;
    &lt;/h:p&gt;
  &lt;/xvcd:template&gt;

  <em>&lt;xvcd:template match="db:indexterm"/&gt;</em>

&lt;/xvcd:xvcd&gt;</pre>
	<p>この XVCD スクリプトを DocBook 文書に適用すると、 (次のように) <a href="http://docbook.org/tdg5/en/html/indexterm.singular.html" title="indexterm (db.indexterm.singular) - DocBook: The Definitive Guide - docbook.org"><code class=" db:tag.element ">db:indexterm</code> 要素</a>が表示されなくなり、全体の見通しが良くなります。</p>
	<p><a href="/shin_itani/memo/xfy/2006/06/20T212153/step03.png"><img alt="スクリーンショット (PNG 形式、約 40KB)" src="/shin_itani/memo/xfy/2006/06/20T212153/step03_thumbnail.png" /></a></p>
</li>
<li>
	<p>最後に、 (箇条書きをあらわす) <a href="http://docbook.org/tdg5/en/html/itemizedlist.html" title="itemizedlist - DocBook: The Definitive Guide - docbook.org"><code class=" db:tag.element ">db:itemizedlist</code> 要素</a> + <a href="http://docbook.org/tdg5/en/html/listitem.html" title="listitem - DocBook: The Definitive Guide - docbook.org"><code class=" db:tag.element ">db:listitem</code> 要素</a>用のテンプレートを追加します。</p>
	<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;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"&gt;

  &lt;xvcd:import href="./_default.module"/&gt;

  &lt;xvcd:vocabulary match="db:*" call-template="_default.root" name="Chapter"/&gt;

  &lt;xvcd:template match="db:para"&gt;
    &lt;h:p&gt;
      &lt;xvcd:apply-templates/&gt;
    &lt;/h:p&gt;
  &lt;/xvcd:template&gt;

  &lt;xvcd:template match="db:indexterm"/&gt;

  <em>&lt;xvcd:template match="db:itemizedlist"&gt;
    &lt;h:ul&gt;
      &lt;xvcd:for-each select="child::db:listitem"&gt;
        &lt;h:li&gt;
          &lt;xvcd:apply-templates/&gt;
        &lt;/h:li&gt;
      &lt;/xvcd:for-each&gt;
    &lt;/h:ul&gt;
  &lt;/xvcd:template&gt;</em>

&lt;/xvcd:xvcd&gt;</pre>
	<p>この XVCD スクリプトを DocBook 文書に適用すると、 (次のように) <a href="http://docbook.org/tdg5/en/html/itemizedlist.html" title="itemizedlist - DocBook: The Definitive Guide - docbook.org"><code class=" db:tag.element ">db:itemizedlist</code> 要素</a> + <a href="http://docbook.org/tdg5/en/html/listitem.html" title="listitem - DocBook: The Definitive Guide - docbook.org"><code class=" db:tag.element ">db:listitem</code> 要素</a>が箇条書きとして表示されるようになります。</p>
	<p><a href="/shin_itani/memo/xfy/2006/06/20T212153/step04.png"><img alt="スクリーンショット (PNG 形式、約 44KB)" src="/shin_itani/memo/xfy/2006/06/20T212153/step04_thumbnail.png" /></a></p>
</li>
</ol>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/06/20T212153.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/06/20T212153.html</guid>
         <category></category>
         <pubDate>Tue, 20 Jun 2006 21:21:53 +0900</pubDate>
      </item>
            <item>
         <title>Unknown XVCD (xfy Basic Edition 1.3 Beta 用)</title>
         <description><![CDATA[<p><a href="/shin_itani/memo/xfy/2006/03/15T214550.html" title="未知の XML ボキャブラリ用の XVCD - xfy.memo">Unknown XVCD</a> を xfy Basic Edition 1.3 Beta 用に改訂しました。</p>
<dl>
<dt>Unknown XVCD</dt>
<dd>
	<p><a href="http://homepage.mac.com/shin_itani/xvcd/2006-06-18/unknown.xvcd" class=" db:uri ">http://homepage.mac.com/shin_itani/xvcd/2006-06-18/unknown.xvcd</a></p>
</dd>
</dl>

<h4>変更内容</h4>
<ul>
<li>
	<p>XVCD ボキャブラリ群の名前空間 URI を変更しました。</p>
</li>
<li>
	<p><code class=" db:tag.element ">h:html</code> 要素の <code class=" db:property ">height</code> プロパティの値を (<code class=" db:literal ">auto</code> から <code class=" db:literal ">1em</code> に) 変更しました。</p>
</li>
<li>
	<p>空白類文字だけから成るテキストノードの判別方法を (<code class=" db:function ">normalize-space()</code> 関数を使う方法から <a href="http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/spec/reference_function.html#white-space" title="プラットフォーム拡張関数リファレンス - xfy.com"><code class=" db:function ">function:white-space()</code> 関数</a>を使う方法に) 変更しました。</p>
</li>
<li>
	<p>XVCD スクリプトファイルの URI を見直しました。</p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/06/18T014011.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/06/18T014011.html</guid>
         <category></category>
         <pubDate>Sun, 18 Jun 2006 01:40:11 +0900</pubDate>
      </item>
            <item>
         <title>祝、 xfy Basic Edition 1.3 Beta リリース !</title>
         <description><![CDATA[<p>xfy Basic Edition 1.3 Beta がリリースされました。取り急ぎ、気づき事項をメモしておきます。</p>
<dl>
<dt>xfy Basic Edition 1.3 BETA - xfy Community</dt>
<dd>
	<p><a href="https://www.xfytec.com/community/modules/mydownloads/singlefile.php?lid=40" class=" db:uri ">https://www.xfytec.com/community/modules/mydownloads/singlefile.php?lid=40</a></p>
</dd>
<dt>xfy Basic Edition 1.3 BETA ダウンロード - xfy Community</dt>
<dd>
	<p><a href="https://www.xfytec.com/community/modules/newbb/viewtopic.php?topic_id=74&amp;forum=10" class=" db:uri ">https://www.xfytec.com/community/modules/newbb/viewtopic.php?topic_id=74&amp;forum=10</a></p>
</dd>
<dt>xfy View Designer 1.0 (BETA) - xfy.com</dt>
<dd>
	<p><a href="http://www.xfy.com/jp/manual/1.3/documents/app/vdesigner/1.0/" class=" db:uri ">http://www.xfy.com/jp/manual/1.3/documents/app/vdesigner/1.0/</a></p>
</dd>
<dt>xfy デベロッパーズガイド : xfy プラットフォーム 1.3 - xfy.com</dt>
<dd>
	<p><a href="http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/index.html" class=" db:uri ">http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/index.html</a></p>
</dd>
<dt>xfy プラットフォーム 1.0 からの変更点 - xfy.com</dt>
<dd>
	<p><a href="http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/overview/changes.html" class=" db:uri ">http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/overview/changes.html</a></p>
</dd>
</dl>

<h4>フォーラムにポストされた紹介記事を読んで</h4>
<ul>
<li>
	<p><a href="http://www.xfy.com/products/basic/view.html" title="xfy View Designer 1.0 BETA - xfy.com">xfy View Designer 1.0 Beta</a> が同梱された。</p>
</li>
<li>
	<p><a href="https://www.xfytec.com/community/modules/newbb/viewforum.php?forum=15" title="xfy Basic Edition 1.3 - xfy Community">フィードバック用のフォーラム</a>が新設された。</p>
</li>
<li>
	<p>前提動作環境が変わった。</p>
	<ul>
	<li>
		<p>J2SE 1.4 JRE → J2SE 5.0 JRE</p>
	</li>
	<li>
		<p>Mac OS X 10.3 → Mac OS X 10.4</p>
	</li>
	</ul>
</li>
<li>
	<p>商用目的で利用できなくなった (評価目的での利用のみ可) ?</p>
</li>
</ul>

<h4>チュートリアル、リファレンスを読んで</h4>
<ul>
<li>
	<p>チュートリアルが充実した。</p>
</li>
<li>
	<p><a href="http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/spec/reference_function.html#white-space" title="プラットフォーム拡張関数リファレンス - xfy.com"><code class=" db:function ">function:white-space()</code> 関数</a>が正式にサポートされた。</p>
</li>
<li>
	<p>XML 文書の表示形式 (<a href="http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/spec/reference_tree.html" title="ツリー表示コンポーネントリファレンス - xfy.com">ツリー形式</a>、<a href="http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/spec/reference_directedgraph.html" title="有向グラフ記述リファレンス - xfy.com">有向グラフ形式</a>) が増えた。</p>
</li>
<li>
	<p>XVCD スクリプト開発用のテンプレート (<a href="http://www.xfy.com/jp/manual/1.3/documents/compo/resource/1.0/index.html" title="Resource File component for xfy 操作マニュアル - xfy.com">リソースファイル編集用</a>、<a href="http://www.xfy.com/jp/manual/1.3/documents/compo/ui/1.0/index.html" title="User Interface Description component for xfy 操作マニュアル - xfy.com">ユーザーインターフェイス定義編集用</a>、 <a href="http://www.xfy.com/jp/manual/1.3/documents/compo/xfr/1.0/index.html" title="XFR component for xfy 操作マニュアル - xfy.com">XFR 編集用</a>) が追加された。</p>
</li>
<li>
	<p><a href="http://www.xfy.com/jp/manual/1.3/documents/dev/developer/1.3/overview/changes.html#domain_namespace-uri" title="xfy プラットフォーム 1.0 からの変更点 - xfy.com">XVCD ボキャブラリ群の名前空間 URI (のドメイン名) が変わった</a>。</p>
	<dl>
	<dt>変更前</dt>
	<dd>
		<pre class=" db:programlisting ">xmlns:<var>xvcd</var> = "http://xmlns.<em>xfytec.com</em>/<var>xvcd</var>"</pre>
	</dd>
	<dt>変更後</dt>
	<dd>
		<pre class=" db:programlisting ">xmlns:<var>xvcd</var> = "http://xmlns.<em>xfy.com</em>/<var>xvcd</var>"</pre>
	</dd>
	</dl>
</li>
</ul>

<h4>実際に触ってみて</h4>
<ul>
<li>
	<p>ホームページが刷新された。</p>
</li>
<li>
	<p>ボキャブラリコンポーネントエリアとファイルエリアとが統合され、ユーティリティエリアになった。</p>
</li>
<li>
	<p>スペルチェック機能が追加された。</p>
</li>
<li>
	<p>サイズの大きい XML ファイルを読み込めるようになった。</p>
	<dl>
	<dt>実例</dt>
	<dd>
		<p><a href="http://www.oasis-open.org/docbook/xml/5.0b5/rng/docbook.rng" title="docbook.rng - docbook.org">DocBook の Relax NG スキーマ (約 484 KB) </a>を読み込めました (xfy Basic Edition 1.0 では読み込めませんでした)。</p>
	</dd>
	</dl>
</li>
<li>
	<p>XHTML コンポーネントが改善され、 XHTML 要素群に名前空間接頭辞が付与されなくなった。</p>
</li>
</ul>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/05/15T225846.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/05/15T225846.html</guid>
         <category></category>
         <pubDate>Mon, 15 May 2006 22:58:46 +0900</pubDate>
      </item>
            <item>
         <title>未知の XML ボキャブラリ用の XVCD</title>
         <description><![CDATA[<p>未知の XML ボキャブラリ (でマークアップされた部分) の内容を表示するための XVCD 「Unknown XVCD」を作ってみました。</p>
<dl>
<dt>Unknown XVCD</dt>
<dd>
	<p>
		<del datetime="2006-06-18" cite="/shin_itani/memo/xfy/2006/06/18T014011.html"><a href="http://homepage.mac.com/shin_itani/xvcd/unknown.xvcd" class=" db:uri ">http://homepage.mac.com/shin_itani/xvcd/unknown.xvcd</a></del>
		<br />
		<ins datetime="2006-06-18" cite="/shin_itani/memo/xfy/2006/06/18T014011.html"><a href="http://homepage.mac.com/shin_itani/xvcd/2006-03-15/unknown.xvcd" class=" db:uri ">http://homepage.mac.com/shin_itani/xvcd/2006-03-15/unknown.xvcd</a></ins>
	</p>
</dd>
</dl>

<h4>背景</h4>
<p><a href="http://yohei-y.blogspot.com/2004/12/blog-post.html" title="未知のボキャブラリのタグをどう表示するか - yohei-y:weblog">yohei-y:weblog</a> で言及されているように、 xfy Basic Edition では未知の XML ボキャブラリ (でマークアップされた部分) は <a href="http://www.xfy.com/ja/manual/app/basic/1.0/xfy_be/view.html#component" title="ボキャブラリコンポーネントを切り替える - ドキュメントの見方を変える - xfy.com">Icon ボキャブラリコンポーネント</a>で表示され、その内容は表示されません。このままでは (特に文書系の XML ボキャブラリを扱う際に) 何かと不便です。</p>

<h4>Unkown XVCD の構造</h4>
<p>Unknown XVCD の構造は至ってシンプルです (テキストノードを出力しているだけです)。</p>
<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;xvcd:xvcd xmlns:xvcd="http://xmlns.xfytec.com/xvcd" version="1.0"&gt;

  &lt;xvcd:vocabulary match="*" call-template="root" name="Unknown"/&gt;

  <code class=" db:tag.comment ">&lt;!-- ルートテンプレート --&gt;</code>
  &lt;xvcd:template name="root"&gt;
    &lt;h:html xmlns:h="http://www.w3.org/1999/xhtml"&gt;
      &lt;h:body&gt;
        &lt;xvcd:apply-templates select="."/&gt;
      &lt;/h:body&gt;
    &lt;/h:html&gt;
  &lt;/xvcd:template&gt;

  <code class=" db:tag.comment ">&lt;!-- 要素ノード用テンプレート --&gt;</code>
  &lt;xvcd:template match="*"&gt;
    &lt;xvcd:apply-templates&gt;
      &lt;xvcd:filler&gt;
        &lt;xvcd:text-of select="."/&gt;
      &lt;/xvcd:filler&gt;
    &lt;/xvcd:apply-templates&gt;
  &lt;/xvcd:template&gt;

  <code class=" db:tag.comment ">&lt;!-- テキストノード用テンプレート --&gt;</code>
  &lt;xvcd:template match="text()"&gt;
    &lt;xvcd:if test="not(normalize-space() = ' ')"&gt;
      &lt;xvcd:text-of select="."/&gt;
    &lt;/xvcd:if&gt;
  &lt;/xvcd:template&gt;

&lt;/xvcd:xvcd&gt;</pre>
<dl>
<dt>ルートテンプレート</dt>
<dd>
	<p>未知の XML ボキャブラリを XHTML にマッピングするために、 <code class=" db:tag.element ">h:html</code> 要素と <code class=" db:tag.element ">h:body</code> 要素とを出力しています (この二つの要素を出力しないと XHTML とみなされないようです)。</p>
</dd>
<dt>要素ノード用テンプレート</dt>
<dd>
	<p>子ノードにテンプレートを適用しているだけです。なお、子ノードが存在しない場合を考慮し、 <a href="http://www.xfytec.com/ja/manual/app/developer/1.0/spec/reference_xvcd.html#apply-templates" title="VC 中核リファレンス - xfy.com"><code class=" db:tag.element ">xvcd:apply-templates</code> 要素</a>内に <a href="http://www.xfytec.com/ja/manual/app/developer/1.0/spec/reference_xvcd.html#filler" title="VC 中核リファレンス - xfy.com"><code class=" db:tag.element ">xvcd:filler</code> 要素</a>を記述しています。</p>
</dd>
<dt>テキストノード用テンプレート</dt>
<dd>
	<p>テキストノードの値を、編集可能なテキストとして出力しています。なお、出力する必要がないと思われるテキストノード (空白類文字だけから成るテキストノード) は処理対象から外しています。</p>
</dd>
</dl>

<h4>Unknown XVCD での表示結果</h4>
<p>下記の XML 複合文書 (XHTML + DocBook) に Unknown XVCD を適用してみました。</p>
<pre class=" db:programlisting ">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
  &lt;body&gt;
    &lt;address xmlns:db="http://docbook.org/ns/docbook"&gt;
      Copyright &amp;#169;
      &lt;db:year&gt;2005&lt;/db:year&gt;,
      &lt;db:year&gt;2006&lt;/db:year&gt;
      &lt;db:holder&gt;Shin&lt;/db:holder&gt;
      All rights reserved.
    &lt;/address&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<table>
<thead>
	<tr>
	<th>
		<p>Unknown XVCD 適用前</p>
	</th>
	<th>
		<p>Unknown XVCD 適用後</p>
	</th>
	</tr>
</thead>
<tbody>
	<tr>
	<td>
		<p><a href="/shin_itani/memo/xfy/2006/03/15T214550/before.png"><img alt="スクリーンショット (PNG 形式、約 32KB)" src="/shin_itani/memo/xfy/2006/03/15T214550/before_thumbnail.png" /></a></p>
	</td>
	<td>
		<p><a href="/shin_itani/memo/xfy/2006/03/15T214550/after.png"><img alt="スクリーンショット (PNG 形式、約 32KB)" src="/shin_itani/memo/xfy/2006/03/15T214550/after_thumbnail.png" /></a></p>
	</td>
	</tr>
</tbody>
</table>
<p>未知の XML ボキャブラリ (でマークアップされた部分) の内容は表示されるようになりましたが、どういうわけか<em>常にブロックレベル要素として表示されてしまいます</em> (何故 ?)。</p>]]></description>
         <link>http://homepage.mac.com/shin_itani/memo/xfy/2006/03/15T214550.html</link>
         <guid>http://homepage.mac.com/shin_itani/memo/xfy/2006/03/15T214550.html</guid>
         <category></category>
         <pubDate>Wed, 15 Mar 2006 21:45:50 +0900</pubDate>
      </item>
      
   </channel>
</rss>
