タコのDITA-OTのFO Plug-in (3)

また前回の続きで、FO Plug-inの話です.
 
■ デタラメなfrontmatter、backmatterの実装
実際に試してみるとわかりますが、FO Plug-inのbookmap/frontmatter, backmatterの実装はきわめていい加減です.ひどい事に指定した順序に出力されないのです.例えばfrontmatterはDITA1.1の仕様では次のようなコンテンツモデルになっています.
 
(booklists or notices or dedication or colophon or bookabstract or draftintro or preface or topicref or
topichead or topicgroup) (any number)
 
booklistは次のようになっています.
((toc) or (figurelist) or (tablelist) or (abbrevlist) or (trademarklist) or (bibliolist) or (glossarylist)
or (indexlist) or (booklist) ) (any number)
 
そこで次のようなfrontmatterを作ってみました.
 
<frontmatter>
  <bookabstract href="taskbook/taskbook-abstract.dita"/>
  <notices href="taskbook/notices.dita">
    <topicref href="taskbook/trademarks.dita"></topicref>
  </notices>
  <booklists>
    <toc/>
  </booklists>
  <preface href="taskbook/task_preface.dita"></preface>
</frontmatter>
 
これをXEPをFormatterに指定して出力すると次の順になります.まったくデタラメです.
 
notice.dita
trademarks.dita
TOC(目次)
taskbook-abstract.dita
task_preface.dita
 
これには実は訳があります.DITAでfrontmatter、backmatterの実装を真剣にやろうと思うと相当難しいのです.frontmatterのコンテンツモデルを見ていただければわかりますが、非常に自由度があります.ところが、一般に本の本文以外の前付けの部分はページ番号付けが特殊です.本文が1,2,3...だったら、I,II,IIIなどと別のページ付けをします.さらに目次も独自のページ番号を持ちます.これら違った種類のページ番号付けに対して、XSL-FOではfo:page-sequenceというオブジェクトを対応させなければなりません.ページの書式はfo:page-sequence毎に一つだからです.そこでfrontmatterをXSL-FOに変換しようとすると、どこまでを同じページ付けをするかをあらかじめわかっていなければならず、通常のスタイルシートでは対応できないのです.スタイルシートを2段階にするなどのそれなりの工夫をしなければなりません.
IdiomのFO Pluginは当初からこの課題を最初から放棄しています.ですからいまだにページ番号はドキュメントで通し一種類ですし、この例のようにまともにfrontmatterを指定した順番にすら出力できないのです.
 
■ 格好付けだけのカタログファイル使用
これはスタイルシートプログラミングの話ですが、どんなプログラマーでも次のコードを見ればびっくりするでしょう.
<!-- [DITA-OT]/demo/fo/xsl/fo/topic2fo_shell.xsl line 31 -->
<xsl:import href="cfg:fo/attrs/custom.xsl"></xsl:import>
<xsl:import href="cfg:fo/xsl/custom.xsl"></xsl:import>
 
「あれ?"cfg:"ってなんだっけ?」「XSLでこんなこと書けたっけ?」という具合です.このtopic2fo_shell.xslは、DITAのマージ済みの中間ファイルからXSL-FOを作るメインのスタイルシートモジュールです.この"cfg:fo/attrs/custom.xsl"はURIで、[DITA-OT]/demo/fo/cfg/catalog.xmlで次のように定義されているのです.
 
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"
    prefer="system">
    <uri name="cfg:fo/attrs/custom.xsl" uri="fo/attrs/custom.xsl"/>
    <uri name="cfg:fo/xsl/custom.xsl" uri="fo/xsl/custom.xsl"/>
    <!-- 途中省略 -->
</catalog>
 
しかし、このスタイルシートが処理するマージ済みの中間ファイルはすでにvalidation済みで、カタログファイルを使ってDTDを関連付けるなどという必要はまったくありません.なんのためにカタログファイルを使うのでしょうか?私には単なる「格好付け」のためにしか映りません.そうでなくともFO Plug-inのフォルダ構造は複雑です.そこに輪をかけて可読性を低めています.
 
■ まとめ
さて以上のようにFO Plug-inのことを紹介してきました.DITA1.2の仕様作成にも加わり、日本のDITAフェスタにも来たことのある、Eliot Kimber氏は、Yahoo!のDITA User's Groupでかつて次のように発言しています.
 
DITA-to-FO: We Must Have New Implementation
http://tech.groups.yahoo.com/group/dita-users/message/14251
 
これをきっかけにしてか、彼はDITA for Publisherをsourceforgeで立ち上げました.現在このプロジェクトのコードは、XSLエディタのoXygenにもバンドルされています.
 
そういう私もFO Plug-inの批判ばかりしているとお叱りをうけるかもしれません.私は特にKimber氏に触発されたわけではありませんが、FO Plug-inのあまりの出来の悪さを知るにつけ、これはもはやDITA普及の障害になっていると確信しています.ともかく、DITA Open Toolkitをダウンロードして、DITAを知りシステムを構築しようとする方にとって、はじめの一歩でFO Plug-inを使うことは問題ないのですが、あとはどうにも使えない、つまりもはや賞味期限が切れているPlug-inなのです.
 
ちょうど会社でI18n Index LibraryのDITA版を作る話があり、このコアのライブラリ部分を除いたDITA→PDFのPlug-inとしてpdf5 Plug-inを作りました.このpdf5 Plug-inは私の知りうる限りのFO Plu-inの欠点を改善し、オープンソースとして公開しています.
 
I18n Index Libraryについてはこちらをご覧ください.
http://www.antennahouse.com/product/i18nindexlib_V2.1/index.html
pdf5 Plug-inについてはこちらをご覧ください.
http://www.antenna.co.jp/AHF/FOsample/XSLSample.htm#DITA
 
pdf5 Plug-inはまだ完璧とは言えませんが、DITAの普及に少しでもお役に立てればと念願しています.