初稿: 2005-08-26
XMLはサブセットを定義して利用しますが、そのサブセット定義をするための言語をスキーマ言語と呼びます。例えば、Aという要素やBという属性を使用できるとか、A要素の内容にはC要素を含むといったような定義を行います。このスキーマ言語として現在使われているものには「DTD(Document Type Definition)」、「XML Schema」と「RELAX NG(Regular Language Description for XML New Generation)」という3つのものがあるため、利用者に混乱を招いています。一体、私たちはどれを選択すればよいのでしょうか。
まず下記のXML文書を見てください。
<?xml version="1.0"?>
<bookshelf>
<book code="ISBN0-0000-0000-1">
<title>はじめてのXML</title>
<author>桃 太郎</author>
</book>
<book code="ISBN0-0000-0000-2">
<title>XML入門</title>
<author>金 太郎</author>
</book>
</bookshelf>
このXML文書を定義したDTDが下記となります。
<!ELEMENT bookshelf (book*)>
<!ELEMENT book (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book code CDATA #REQUIRED>
XMLは「W3C(World Wide Web Consortium)」というウェブに関する標準を定める機関が勧告した技術です。実はDTDは単独の言語というよりXML仕様の一部です。また「DTD」とは一般的な呼び名であり、XML仕様の中では「マークアップ宣言(Markup declaretion)」と呼ばれています。このため、DTDはXML標準のスキーマ文法となっています。しかし、XMLが普及したことでサブセット定義に高度な要求が多くなり、それを想定していないDTDでは不満が多くなってきました。例えば、DTDでは「A要素の内容にB要素が1から5個含まれる」といった定義をするだけでも容易にはできません。また一般的なデータ型を持っておらず、数値型、日付型、真偽値型というようなデータ型の指定ができません。さらにXMLでは後に名前空間(name space)という複数のサブセットを1つの文書で使用するための仕組みが追加されていますが、DTDではこの仕組みは全く考慮されておらず扱えません。そして最も顕著なものが、DTDとXMLとの文法は全く別のものになっており、利用者はXMLとは別にDTDの文法を覚えなければいけないということです。また1つの文書に2つの文法が存在することになり、これを処理するプログラムにも負担となるわけです。これらの理由により、DTDに代わる次世代のスキーマ言語が登場しました。それがXML Schemaです。
DTDへの不満に対する答えとしてW3Cが出したのが、XML Schemaです。前節のDTDと同じサブセットを定義するXML Schemaは下記のようになります。ただし、サブセットの名前空間を新たに定義しています。
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:bs="http://www.yt3.info/bookshelf"
targetNamespace="http://www.yt3.info/bookshelf">
<element name="bookshelf">
<complexType>
<sequence>
<element ref="bs:book" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<element name="book">
<complexType>
<sequence>
<element ref="bs:title"/>
<element ref="bs:author"/>
</sequence>
<attribute name="code" type="string"/>
</complexType>
</element>
<element name="title" type="string"/>
<element name="author" type="string"/>
</schema>
XML Schemaでの大きな特徴はそれ自体がXMLサブセットとして定義されていることです。つまり、XMLであるXML Schemaで、XMLサブセットを定義するということになります。これにより、XMLとスキーマ言語で統一した文法を使用できることになり、スキーマ言語に新たに文法を覚える必要がなくなりました。またサブセットの構造にきめ細かな定義ができ、同時に一般的なデータ型を扱え、当然名前空間も扱えるようになりました。これでDTDでの不満は解決されたわけですが、XML Schemaではオブジェクト思考を強く意識しすぎたためか、必要以上に仕様が大きくなっており複雑になっています。このためソフトウェアでの実装は難しいといわれ、利用者の習得も困難になるという新たな問題が発生することとなりました。これに不満を持った人たちがXML Schemaに対抗すべく新たなスキーマ言語を誕生させました。
XML Schemaへの対抗としてRELAXとTREXという2つのスキーマ言語が現れました。後にこの2つの言語は統合され、RELAX NGというスキーマ言語が誕生しました。まず前節のXML Schemaと同じサブセットを定義したRELAX NGを見てみましょう。
<?xml version="1.0"?>
<element name="bookshelf"
xmlns="http://relaxng.org/ns/structure/1.0"
ns="http://www.yt3.info/bookshelf">
<zeroOrMore>
<element name="book">
<attribute name="code">
<text/>
</attribute>
<element name="title">
<text/>
</element>
<element name="author">
<text/>
</element>
</element>
</zeroOrMore>
</element>
RELAX NGもXMLサブセットとして定義されたスキーマ言語ですが、XML Schemaに比べ簡単に扱えるように設計されています。RELAX NGではXML Schemaの問題点である複雑さに対して、その簡単さを売りにしています。機能的にはXML Schemaに対して劣るということはなく、同等の定義がより直感的にできます。RELAX NGはOASIS(Advancement of Structured Information Standards)という機関により勧告され、国際標準であるISOともなっています。XML SchemaはXMLの生みの親であるW3Cが勧告していますが、W3C内部ではRELAX NGを支持する流れもあり、実際にスキーマ定義にRELAX NGを採用したW3Cの勧告もあります。例えば、現在ドラフト段階のXHTML 2.0は、RELAX NGを採用したものとしてよく知られています。
では利用者の立場になって、実際にどれを選択すればよいのか考えてみましょう。現時点ではXML SchemaとRELAX NGのどちらが将来的に次世代スキーマ言語の標準となるかは非常に難しい問題です。歴史的にはよりシンプルな技術が勝ち残っているケースが多いことから考えると、RELAX NGとなりますが、やはりXMLと同じ機関が勧告するXML Schemaは有利でしょう。将来XML仕様がバージョンアップするとき、標準のスキーマ言語として外部のものを採用することは考えにくいからです。筆者の見解としてはRELAX NGの方が直感的で分かりやすく便利だと感じたことから、RELAX NGを推奨したいと思います。ただ、名前空間などDTDで定義できない箇所がない限り、現時点でXML標準であるDTDを使用することが懸命でしょう。