DITA⇒よくわかりません!(その3)

すみません.keyrefによるトピックの参照、外部URIの参照はもう少し実際的な例がありました.先にもう少しそれを紹介します.

前回「トピック内からトピックを参照するのにkeyrefを使用して動的に参照先を切り替えるというのは、どのような実践的なuse caseがあるのかちょっとわかりません.」と書きましたが、トピック内からのトピックの参照は一般的にはxrefです.例えば、製品諸元のページへの参照を促すには、
 
<p>製品諸元については<xref keyref="PRODUCT_SPEC" type="dita"/>を参照ください.</p>
 
と書きます.
 
イメージ 1

しかしDITAではxrefの使用はあまり勧められません.それでは本来このような情報をどこに書くかというと、マップのreltableです.例えば各章で製品諸元を参照したければ、
 
<reltable toc="no">
  <relrow>
    <relcell>
      <topicref keyref="PRODUCT_SPEC" linking="targetonly" navtitle="製品諸元"/>
    </relcell>
    <relcell>
      <topicref href="start_engine.xml" navtitle="エンジンをかける."/>
      <topicref href="run.xml" navtitle="走行する."/>
      <topicref href="stop.xml" navtitle="止まる."/>
      <topicref href="stop_engine.xml" navtitle="エンジンを切る."/>
    </relcell>
  </relrow>
</reltable>
 
と書きます.こうするとstart_engine.xml~stop_engine.xmlのrelated-linksに製品諸元へのリンクが自動的に挿入されます.
 
イメージ 2
 
あとマップからの外部URIの間接参照で、次のようなアイディアがあります.それはbookmap/bookmetaに出力する文書の表紙で使用するの会社ロゴ、製品画像を格納する方法です.一般的に表紙で使用する画像は(表紙はトピックに対応しないので)トピックから参照されることはありません.ですのでたいていDITA-OTのプラグインのフォルダに画像を格納する方法がとられてきました.例えば、
 
[DITA-OT]/plugins/[プラグインフォルダ]/common-graphic/company_logo.png
[DITA-OT]/plugins/[プラグインフォルダ]/common-graphic/sr125.jpg
[DITA-OT]/plugins/[プラグインフォルダ]/common-graphic/ty125-4T.jpg
 
という具合です.使用する画像の数が少ないうちは良いのですが、製品画像もここに入れてしまうと扱う製品の数が増えるにしたがって管理が大変になります.またマップやトピックはCMSで管理するのに、重要な製品画像はプラグイン側にあるというのも本来は良くありません.やはりCMSで一括管理するのが望まれるでしょう.ではロゴや製品画像をCMSに入れたとすると、こんどはマップにそれらへの参照を作ってやらねばなりません.bookmapにそのような用途にあった要素がないか見てみるとdataがありました.例えばこのように使用します.
 
<bookmeta>
  <data name="NAME_COVER_RESOURCE">
    <data name="NAME_COMPANY_LOGO"><image keyref="KEY_COMPANY_LOGO"/></data>
    <data name="NAME_PRODUCT_LOGO"><image keyref="KEY_PRODUCT_IMAGE"/></data>
  </data>  
</bookmeta>
 
キー定義は例えば次のようになるでしょう.
 
<keydef format="png" href="scorpa.png" keys="KEY_COMPANY_LOGO" navtitle="Company logo" processing-role="resource-only"/>
<keydef format="jpg" href="sr125.jpg" keys="KEY_PRODUCT_IMAGE" navtitle="Product image" processing-role="resource-only" product="sr125"/>
<keydef format="jpg" href="ty125-4T.jpg" keys="KEY_PRODUCT_IMAGE" navtitle="Product image" processing-role="resource-only" product="tys125"/>
 
すくなくともこれでDITA-OTがちゃんとキーを展開してくれるのは確認できました.product="tys125"でフィルタリングした中間ファイルは次のようになります.
 
<bookmeta class="- map/topicmeta bookmap/bookmeta " xtrc="bookmeta:1" xtrf="...">
  <data class="- topic/data " name="NAME_COVER_RESOURCE" xtrc="data:1" xtrf="...">
    <data class="- topic/data " name="NAME_COMPANY_LOGO" xtrc="data:2" xtrf="...">
      <image class="- topic/image " format="png" href="scorpa.png" keyref="KEY_COMPANY_LOGO" placement="inline" xtrc="image:1" xtrf="...">Company logo</image>
    </data>
    <data class="- topic/data " name="NAME_PRODUCT_LOGO" xtrc="data:3" xtrf="...">
      <image class="- topic/image " format="jpg" href="ty125-4T.jpg" keyref="KEY_PRODUCT_IMAGE" placement="inline" product="tys125" xtrc="image:2" xtrf="...">Product image</image>
    </data>
  </data>  
</bookmeta>
 
会社のロゴ画像を使うときには、概念的にbookmap/bookmata/data[@name='NAME_COVER_RESOURCE']/data[@name='NAME_COMPANY_LOGO']/image/@hrefという一個のXPath式で参照先を取得できます.スタイルシートにとってはとても簡単で便利です.(実際のDITAのスタイルシートの流儀では要素名を直接参照しません.@class属性を使って参照します.)
 
この問題、Yahoo!のdita-usersにお知恵を拝借したのですが、意外とDITAのユーザーでは共通の課題なのかもしれません.data要素のkeyref属性が展開されないのはDITA-OTのバグではないかという気もしますが...
 
 
さて実はこのアイディアは未完成です.何故かというとDITA-OTでの処理はOKなのですが、問題はCMSなのです.CMSがkeyref/keydefで参照している画像を認識してちゃんとチェックアウトしてくれるかがカギになります.CMSもkeydefで全製品分の画像が定義されていた場合、毎回全製品分チェックアウトしたのでは効率が悪すぎます.DITA1.2の仕様に基づいて選択される画像のみチェックアウトしなければならないでしょう.DITA1.2を忠実に効率的に実装するためにはCMS側も相当賢くならないとだめなのかもしれません.
 
この次にやっとkeyrefによる「キー定義のtopicrefにあるXMLコンテンツへの参照」について紹介したいと思います.