DTDかXML Schemaか?

以前XML Schemaを使用してMathMLをDITAインスタンスにオーサリングする例を試したことがあります.しかしXML Schemaは実際の業務では使用したことがありませんでした.主にCMSDTDしかサポートしていないというのが理由だったのですが、いまの時代いくらなんでもDTDではレガシーすぎます.実際DITAをお使いの方からもXML Schemaを使用できないか?というご要望が出ています.
 
ちょうどEliot Kimberさんの「DITA Configuration and Specialization Tutorials」を読み返す機会があったのですが、そこにはKimberさんが「DTD or XSD?」と題してDTDXML Schemaのどちらを選択すべきかを書いている章がありました.あらためて紹介します.
 

 
まずXML Schemaを使用する利点ですが、Kimberさんは次のようにまとめています.
 
1. XML Schemaはネームスペースをサポートしており、ネームスペースの使用は望ましい.
2. XML SchemaDTDより表現力に富んでいる.
3. XML SchemaXML文書であるので、DTDでは出来なかった方法でXMLベースの文書をXML Schema中に記述することができる.
4. XML SchemaXML文書であるので、DTDより処理に都合が良い.(ただしXML Schemaを処理するのと同等レベルにDTDを処理できるパーサーは存在する)
 
これを読んで考えました.
 
確かにDITAでSVGとかMathMLを使おうとしたらXML Schemaしか手段はないと思います.ネームスペースをサポートしていないDTDでは無理でしょう.例えばMathMLを使用する分野はそれなりに限られているでしょうが、オーサリングツールで数式エディタのようなプラグインが使用できたら、その結果を文書の中にそのままMathMLとして埋め込みたいと考えるのはもっともです.
 
またオーサリングツールとそのプラグインSVGを直接作ることはないでしょうが、それでも外部アプリケーションでSVGを作って埋め込みたい場合はあります.やはりラスターではなく簡単に使用できるベクター画像はどうしても必要なのです.この場合、イラストレータのように本格的ではなくとも、Microsoft Visioのようなもので作ったSVGを文書中に簡単に埋め込めたら非常に便利です.SVGもimage要素で記述できますが、外部に画像を保管しなければならなくなるので手間が増えます.topicに固有の画像だったら、そこに埋め込めるに越したことはありません.
 
またXML Schemaはご存知のようにDTDでは記述できないデータ型をサポートしています.DITAはXMLデータではなくXML文書ですので、データ型など必要なのかと短絡的に考えることもありました.しかし業務で使用する実際の文書の中には、単位量(~mg/l)など間違ってはならない数値を記述する場合があります.このような種類のデータがちゃんと記述されているかを検証する上でXML Schemaでのデータ型は必須の要件になるでしょう.
 
さてこれほどXML SchemaDTDにはない利点を持っているのですが、「DTDを使うべきか?XML Schemaを使用すべきか?」という問いに対するKimberさんの答えは意外です.
 
"The short answer is "use DTDs unless you absolutely have to use XSDs" for now. This answer will hopefully change in the future."
 
「端的に言えばXML Schemaをどうしても使う必要がない限り今はDTDを使うべきです.この回答が将来変わることを期待します.」
 
なぜこのような回答になるのでしょうか?それはDITAのスキーマをめぐる複雑な現状があるからです.
 
"The reason for this is simple: DITA's XSDs currently depend on the redefine feature of XSD. Unfortunately, the definition of redefine in the XSD 1.0 specifications is ambiguous to the point that different conforming XSD processors will produce different results for the same set of XSD documents. For this reason, the redefine feature is deprecated in XSD 1.1 (under development at the time of writing). Unfortunately, as currently formulated, DITA's XSDs depend on one particular interpretation of redefine, the one implemented by the Xerces 2.x parser."
 
「この理由は単純です:DITAのスキーマは現在XML Shemaのxs:redefineの特性に依存しています.残念ながらxs:redefineのXML Schema 1.0における定義は曖昧で、異なったXML Schemaプロセッサが同じXML Shema文書セットにに対して異なった結果を生成しうるのです.この理由のため、xs:redefineはXML Schema 1.1(執筆時は改定中)でdeprecatedとされました.残念なことに現時点で公式に言えるのは、DITAのXMLスキーマはXerces 2.xパーサーの実装するところのxs:redefineの固有の解釈に依存しているということです.」
 
XML Schema 1.1は2012年5月にW3Cで勧告になりました.xs:redefineは残っていますが将来廃止されるとされています.また現時点ではXercesはまだ部分的にXML Schema1.1を実装した状態のままのようです.DITAのXML SchemaもDITA Open Tool Kit 1.6.3に付属のスキーマを見るとやはりxs:redefineが使用されています.
 
このためオーサリングのフロントエンドのツールがXercesを使用し、バックエンドのCMSもXercesを使用していればXML Schemaを選択しても問題はないのかもしれません.例えばoXygenはJavaインプリメントされているのでXercesを検証に使用しています.しかしXMetaLのような非Javaのオーサリングツールは自前でXML Schemaのパーサーを持っています.
 
ところでCMSの側はどうでしょうか?一般的にはCMSはそのプラットフォームのパーサーを使用しているようです.CMSのメーカーがパーサーを自前で開発しているという話は聞いたことがありません.例えばMicrosoftプラットフォームではMSXMLや.netのパーサーを使用しているとうかがいました.
 
DTDXML Schemaという問題はオーサリングツールだけでなくCMSまでからんだ問題になります.ですから単にXML Schemaの方が優れているからというだけで判断することはできないようです.
 
早くXML Schemaの実装が統一され、どのパーサーでも安心してDITAのスキーマが使えるようになってくれれば良いのですが、それまではもう少し時間がかかりそうですね.