DITA Open ToolkitのCMS組込み

昨年仕事で作成したDITA Open Toolkit用のplug-inを納品したのですが、これとDITA Open ToolkitををCMSに組み込むためお客様のところにはるばるヨーロッパからCMSのベンダーの方がやってきました.私の方は組み込みのための作業についてレクチャーをしていただくということで東京に出張となりました.
組み込みの主な点ですが、やはりDTDのカスタマイズが焦点になるようです.plug-in本体には特別なカスタマイズは行なわないようでした.
 
何故DTDのカスタマイズが必要になるのでしょう?
 
まずCMSとは関係なく、お客様の扱っている文書の構造が標準のDITAだけでは表現できず、特殊化(Specialization)が必要となります.まずここで新規のカスタマイズされたDTDが追加されます.
 
またCMSが文書の管理上必要な属性を加えるという必要性があります.
 
そして、次のようなシステム要件が加わります.
 
1. このCMSMicrosoftアーキテクチャをベースにしていること.つまりパーサーはMSXML4, 6及び.netのSystem.XMLを使用します.
 
2. これに対してDITA Open Toolkitは、Javaベースのシステムです.パーサーはApacheのXercesを使用します.
 
CMS環境ではこの両方をサポートする必要があります.
 
更にDITA Open ToolkitではXercesでのパージングにOASISのカタログファイルを使用します.ところが御存知のように、MSXML4, 6ではカタログファイルの機構は利用できません.ですからDTDもカタログファイルを使用して動くだけでなく、カタログファイルなしでも動くようにコーディングしなければなりません.
 
例えば、カタログファイルを使えば
 
<!ENTITY % indexing-d-dec     PUBLIC
 "-//OASIS//ENTITIES DITA 1.2 Indexing Domain//EN"
 "indexingDomain.ent">
 
と書いても実際のURIは公開識別子からマッピングされるので"indexingDomain.ent"はいわばどう書いても良いのですが、MSXMLだとそうはいきません.ちゃんと実際のindexingDomain.entを参照するようにフォルダ構造が書かれていなければなりません.
 
<!ENTITY % indexing-d-dec     PUBLIC
 "-//OASIS//ENTITIES DITA 1.2 Indexing Domain//EN"
 "../../base/dtd/indexingDomain.ent">
 
また、xml:spaceの記述も違いがあるようです.DITA Open Toolkitでは、
 
<!ENTITY % xxx.attributes
          "...
           xml:space  CDATA   #FIXED  'preserve'">
 
と書いて通りますが、両方のパーサーで通すためには
 
<!ENTITY % xxx.attributes                    
           "...
            xml:space  (preserve)   #FIXED  'preserve'">
 
と書かないと通らないとのこと.などなど.
 
実はこのお客様向けの特殊化したDTDは私が作ったのですが、そうでなくとも複雑なDITAのDTDを拡張するとなると、時としていわゆる"DTD地獄"になります.(何重にもいろいろインクルードしているDTDは一歩まちがえるとデバッグが大変なのです.)実際に中を見てみるとCMSベンダーの方は、私の作ったDTDを綺麗にカスタマイズしていました.さすがです.やはり餅は餅屋でということでしょうか?