DITA⇒よくわかりません!

DITAの仕事をさせていただいておりますが、「DITA知ってますか?」と単刀直入に聞かれたら「まだ駆け出し者で、わからないことだらけです.」と答えざるを得ません.DITAというのは、確かに世界で多くの先進企業に使用されているのでしょうけれども、ある意味DocBookなんかより非常にむつかしいと思います.例えば今年開催されたDITAフェスタなどでもDITA1.2の重要な機能としてキーがあげられていました.このキーは実は私にとっては鬼門です.正直よくわかりません.今回この「わからない」点について順に書いてみようと思います.
 
まずキー以前のDITA1.1のconrefから復習してみます.DITA1.1では再利用コンテンツを参照/取得するのにconrefを使っていました.例えば「工場出荷時の設定に戻すには、リセットキーを押します.」という操作手順を製品系列で共通に使用したいと考えます.その場合、このcmdを共通に使用する別ファイル(ctr.xml: 勝手につけました.Common Task Resourceの意味)に保存して、power_on.xmlから次のようにconrefを使用するでしょう.
 
[conrefの例]
 
イメージ 1
 
この方法はDITA1.2が出ている今でも広く使用されています.DITA1.1にはこれしかなかったからです.問題はpower_on.xmlからctr.xmlにconrefで「ハードリンク」が張られることです.power_on.xmlとctr.xmlはconrefにより分かちがたく結合されます.power_on.xmlを再利用するときにも必ずctr.xmlがなければなりません.
 
それでは次のようなシナリオを考えて見ましょう.製品がある時点から設計変更され、「工場出荷時の設定に戻す」ためには、リセットキーではなく、「パネルに表示されたリセットボタンを押す」ようになったとします.このようなときどうするでしょうか?「工場出荷時の設定に戻すには、パネルのリセットボタンを押します.」というエントリーをctr.xmlに登録して、power_on.xmlを変更したバージョンを作るのでしょうか?もしpower_on.xmlが単純だったらこのような選択もあるかもしれません.しかし変更点がこの工場出荷時への復帰操作だけだったとしたら、このような修正を行うのは冗長です.
 
このようなときのために使用するのがconkeyrefです.例えば先ほどのconrefの例をconkeyrefを使用するようにするには、次のように記述します.mapで<keydef keys="COMMON_TASK" href="ctr.xml"/>と定義し、power_on.xmlからは、<cmd conkeyref="COMMON_TASK/reset_to_default"/>
としてctr.xmlの内容を参照します.
 
[conkeyrefの例]
 
イメージ 2
 
[XMetaL8での表示例]
 
イメージ 3

これはどういう利点があるかというと、<cmd id="reset_to_default">工場出荷時の設定に戻すには、パネルのリセットボタンを押します.</cmd>という内容の別ファイルを作って、ctr_2013.xmlに保存しておき、mapで<keydef keys="COMMON_TASK" href="ctr_2013.xml"/>とキー"COMMON_TASK"に対する参照先を変更しさえすれば、参照元のpowe_on.xmlは変更しなくて済むのです.つまりトピックでなくmapのキー定義を変更することにより、このような製品の仕様変更に柔軟に対応できるのです.
 
["COMMON_TASK"の@herfをctr_2013.xmlに変更]
イメージ 4
 
[XMetaL8での表示例:キーの参照先を変えると元の表示も変わります]
イメージ 5
 
conkeyrefのconrefとの決定的な違いはconrefが参照先topicとハードリンクしているのに比べ、conkeyrefはmapのキー定義を通じて参照先を求めるのでハードリンクがなくなる点です.逆に問題はpower_on.xmlは単独ではオーサリングソフトでは表示できなくなることです.conkeyrefの内容を表示するには、常にキーが定義されているmapが必要になります.
 
DITA1.1のころは、「オーサリングはtopic単位に行い、bookmapは少しbookmetaのパラメータを入れてCMSが自動的に作るんだよ.」という話を聞いたことがありました.しかしこのような仕組みでは、このDITA1.2のconkeyrefには対応できないでしょう.先に書いたように、トピックの編集(表示)にmapが必要になるからです.
 
今回mapに<keydef>という仕組みを使いました.topicrefでもキーは定義できますが、keydefはキーを一番明確に定義できます.conkeyrefはこのキーを使って、直接参照のconrefの欠点を補い、間接参照を実現するという点で仕様がはっきりしています.
 
しかしこのキーを使う仕組みは、conkeyrefだけでなくkeyrefというのがあります.私はconkeyrefは一発で理解できましたが、keyrefはずっと理解できませんでした.次はそれについて書いてみたいと思います.