当初は、XMLはDocument Type Definition(DTD)を規定していました。XML 1.0はSGMLから継承したスキーマ・テクノロジーとセットになっていました。しかし、多数のXMLユーザは、DTDがXML自体とは異なるシンタックスを使用していることついて不満をもっていました。そのため、W3Cは、DTDの後継テクノロジー(W3C XML Schema)を開発しましたが、「委員会によって設計された」このスキーマに複雑すぎると不満を持ち始める人がいました。別のグループが、RELAX NGおよびSchematronといったスキーマ・テクノロジーを開発しました。これらの技術にはすべて長所、短所があり、結果として不満を持つ人々を持つことになりました。しかし締切りを抱えた技術者にとって、概要を作成することは余りにも大きな負担でした。
確かに、スキーマを開発することはよいことです。他に理由がなければ、スキーマはフォーマット文書を作り出します。しかし実際の世界では、悩まされた開発者が取る最も一般的なコースは、適切なスキーマの目的に役立つようにXMLフォーマットのサンプルを開発することです。しかし、もしそのサンプルが正式なスキーマの役に立つとしたら、特に妥当性の検証ができるとしたらどうなるでしょうか?Eric van der Vlist 氏はサンプル・ドキュメントが正式なスキーマとして役立つシステムの開発に着手しました。そして、彼が作り出したものが、Examplotronです。
この記事で私は、Examplotronを紹介します。このシステムを使用することは簡単です。したがって、downloading Examplotron 0.7 (compile.xsl)からダウンロードし、好みのXSLTおよびRELAX NGプロセッサーを使用してください(関連するリンクに関しては参考文献を参照)。ダウンロードするExamplotron実装ファイルはcompile.xslというファイルです。私はこの名前は一般的すぎると思い、私のマシン(およびこの記事)においては、eg-compile.xslと名前を変更しました。
Examplotronを使用すると、任意のXMLインスタンスを参照し、コンパイル済みのExamplotronスクリプトを生成するコンパイラーをとおしてExamplotronを実行します。その後、実際のインスタンス文書をバリデートするためにスクリプトが実行されます。Examplotronの初期のリリースでは、プロセスは図1のようなものでした:
図1.Examplotronの初期のバージョンの処理モデル
これはSchematronのバリデートの最も一般的なメカニズムに類似しています。スキーマ(Examplotronの場合には参照インスタンス文書)は、XSLTスクリプトにコンパイルされます。そしてこのXSLTスクリプトは、他のXML文書に対してスキーマのバリデーションチェックを実行できます。最新のExamplotronのバージョン(この記事の中で説明している0.7を含む)は、図2のような異なるプロセスを使用しています。
図2.Examplotronの最新バージョンの処理モデル
宛名ラベルのXMLフォーマットについて考えてみます。フォーマットを通して考えられるように、リスト1(eg1.xml)のような簡単な例を示します。
リスト1.宛名ラベルの例と妥当なExamplotronスキーマ(eg1.xml)
<?xml version="1.0" encoding="utf-8"?>
<labels>
<label>
<name>Thomas Eliot</name>
<address>
<street>3 Prufrock Lane</street>
<city>Stamford</city>
<state>CT</state>
</address>
</label>
</labels>
|
この単純な例は、いかなる騒動も空騒ぎもなく、完全に有効なExamplotronスキーマであることは明らかです。妥当性の検証として、任意のXSLTプロセッサーおよびeg-compile.xslスクリプトを使用しこのファイルをコンパイルして、実行可能なものにすることができます。
$ 4xslt -o eg1.rng eg1.xml eg-compile.xslt |
上の4xltコマンドラインのフォーマットは、4xslt -o [output file] [source file] [XSLT file]です。出力ファイル(eg1.rng)はRELAX NGファイルです。これを確認するために任意のRELAX NGプロセッサーを使用することができます。この記事では、私は4SuiteのRELAX NG機能(これもまたEric van der Vlist氏によって作成され、xvifに基づいています)を使用しています。eg1.xmlはスキーマであり、有効なソース・ドキュメントですので、私はこのファイルに対して作成されたスキーマを適用することができます。
$ 4xml --rng=eg1.rng eg1.xml |
上の4xmlコマンドラインのフォーマットは、4xml --rng=[RELAX NG schema file] [source file]です。デフォルトでは、RELAX NGバリデーション・エラーが見つかっていない限り、ソース・ドキュメントが端末にエコーされることになっているので、この実施においてはエコーされるはずです。効果的なテストとしては、eg1.xmlと一致した内容の異なるドキュメントに対して、作成済みのRELAX NGスキーマを適用することができます 。たとえば、リスト2(test1.xml)のようなドキュメントです。
リスト2.Examplotronスキーマに対するバリデーション用サンプル・ドキュメント (test1.xml)
<?xml version="1.0" encoding="utf-8"?>
<labels>
<label>
<name>Ezra Pound</name>
<address>
<street>45 Usura Place</street>
<city>Hailey</city>
<state>ID</state>
</address>
</label>
</labels>
|
私は以下のようにスキーマを適用します:
$ 4xml --rng=eg1.rng test1.xml |
そして再び結果は妥当です。リスト3(test2.xml)は妥当でないドキュメントの例です。上記のeg1.rng に対して妥当性を検証しようとすると、次のようなエラーメッセージを受け取ります。"Qname quote not expected" これは、Examplotron ソース文書内でquoteエレメントが有効であると示唆している箇所が存在しないためであり、納得がいきます。
リスト3.Examplotronスキーマ(test2.xml)に対して妥当でないサンプル・ドキュメント
<?xml version="1.0" encoding="utf-8"?>
<labels>
<label>
<quote>What thou lovest well remains, the rest is dross</quote>
<name>Ezra Pound</name>
<address>
<street>45 Usura Place</street>
<city>Hailey</city>
<state>ID</state>
</address>
</label>
</labels>
|
もちろん、私がExamplotronスキーマとして示したXMLサンプルは、バリデーション用に必要な全ての情報を伝えているとは限りません。例えば、サンプル・ドキュメントから省略されたいくらかのオプションの要素あるいは属性があるでしょうか?この問いは、あなたがExamplotronソース・スキーマに、オプションのものさえもあらゆる要素あるいは属性を常に含んでいるかどうかを確認すれば解決できます。Examplotronは、いくつかの要素がオプションであることを示すことができるようになっています。また、生じ得る別の疑問は、1つ以上のlabel要素が可能なのか、ということです。要素を1つ以上を持つことができると示したければ、単純にExamplotronソース内で要素を複数回記述すればよいのです。リスト4(eg2.xml)は1つ以上のlabel要素が可能であることを明示するExamplotronソース・ファイルです。
リスト4.複数のlabel要素が可能な宛名ラベルExamplotronのソース (eg2.xml)
<?xml version="1.0" encoding="utf-8"?>
<labels>
<label>
<name>Thomas Eliot</name>
<address>
<street>3 Prufrock Lane</street>
<city>Stamford</city>
<state>CT</state>
</address>
</label>
<label/>
</labels>
|
2番目のlabelが空であることに注目してください。Examplotronは、第1のlabelから要素の内容モデルを取得し、第2のlabelは純粋にlabelが二度以上生じる可能性があることを示す目印であると理解します。したがって、第2のlabelを空にしておくことができるのです。可読可能な例としてExamplotronソースを見ている人々を混乱させないようにするために、予期された内容ですべての要素を満たしておいた方がよいかもしれませんけれど。リスト5(test3.xml)はリスト4に対して有効なドキュメントの例で、1つ以上のlabelを持っています
リスト5.リスト4に対して有効なサンプル・ドキュメント(test3.xml)
<?xml version="1.0" encoding="utf-8"?>
<labels>
<label>
<name>Thomas Eliot</name>
<address>
<street>3 Prufrock Lane</street>
<city>Stamford</city>
<state>CT</state>
</address>
</label>
<label>
<name>Ezra Pound</name>
<address>
<street>45 Usura Place</street>
<city>Hailey</city>
<state>ID</state>
</address>
</label>
</labels>
|
このドキュメントはリスト1に対して有効ではありません。リスト1は1つだけlabel要素を持つのでExamplotronは文字通りに判断し、1つの要素だけを許すRELAX NGスキーマを生成します。さらに、そのデフォルトではExamplotronスキーマに現れる全ての要素はデフォルトで必要とされています。
これはここまでは素晴らしいが、現実世界にとっては全く柔軟ではありません。通常XMLフォーマットでは、ある要素がオプションであるか、あるいは何度か使用されるのかを明示しなければなりません。DTDでは、これを表現するために出現の指示 (occurrence indicators)を使用します。ExamplotronはDTDのように、サンプル・ドキュメントに基づいて非常に良く推測を行います。しかしほとんどの場合、正確な結果を得るにはほんの少し支援をしなければならないでしょう。ソース・ドキュメントに、DTDの出現の指示に似た特別の属性を加えることで、Examplotronにヒントを提供することができます。リスト6(eg3.xml)で、0または、1つ以上のlabel要素を指定し、1つのオプションquote要素を持つことができるExamplotronスキーマを示しておきます。
リスト6.Examplotronのヒント属性を使用する宛名ラベルのExamplotronソース (eg3.xml)
<?xml version="1.0" encoding="utf-8"?>
<labels xmlns:eg="http://examplotron.org/0/">
<label eg:occurs="*">
<quote eg:occurs="?">Midwinter Spring is its own season...</quote>
<name>Thomas Eliot</name>
<address>
<street>3 Prufrock Lane</street>
<city>Stamford</city>
<state>CT</state>
</address>
</label>
</labels>
|
このドキュメント内の特別なExamplotron 名前空間の宣言に気づいてください。それはヒント属性を加えるために使用されています。eg:occurs 属性はDTDの出現の指示に似た値を持っています。従って、「*」は 「0あるいはそれ以上」を意味し、「+」は「1もしくはそれ以上」を意味し、「?」は「0または1」を意味します。(これらの値についての詳細は、参考文献のExamplotronホームページを参照してください。)
混合内容(XML要素内の子要素およびプレーンテキストを混合すること)は、スキーマ言語間でサポート状況にむらがあります。そしてそれがXMLの決定的な特徴のうちの1つであることは残念なことです。Examplotronでは巧妙な方法で、このサポートを他の特徴と同じぐらい容易にサポートしています。リスト7は任意のquote要素が内容を混合させるExamplotronスキーマで、emphおよびstrongタグが埋め込まれています。
リスト7.混合内容のサポートを実証する、宛名ラベルExamplotronソース
<?xml version="1.0" encoding="utf-8"?>
<labels xmlns:eg="http://examplotron.org/0/">
<label eg:occurs="*">
<quote eg:occurs="?">
<emph>Midwinter</emph> Spring is its own <strong>season</strong>...
</quote>
<name>Thomas Eliot</name>
<address>
<street>3 Prufrock Lane</street>
<city>Stamford</city>
<state>CT</state>
</address>
</label>
</labels>
|
再びExamplotron の根本原則に関して:Examplotronに構築のサンプルを示せば、ExamplotronはRELAX NG フォームへそのサンプルをうまく組み入れます。Examplotronは同様の方法で名前空間もサポートします。ソース・ドキュメント内で名前空間をただ使用してください。そうすれば、ExamplotronはRELAX NGにそれらの名前空間を組み入れます。データ型のような他のスキーマの特徴はヒント属性によってサポートされています。より高度な特徴に関する詳細については、(参考文献から)Examplotronの仕様書を参照してください。
スキーマシステムはおそらく最もすばらしい技術進歩をとげているXMLの分野です。なおかつ、XMLスキーマシステムに関する全ての業績において、Examplotronが最も光り輝き、かつシンプルなアイディアであると思っています。私は、Examplotronが生産性に対して驚くべき効果を生じることに誰もが気づくだろうと思っています。最近のプロジェクトにおいては、多くのXMLフォーマットを持っていた顧客が、文書用のスキーマおよびこれらXMLフォーマットの妥当性検証を開発するために私の会社Fourthoughtを通して私を雇用しました。彼らが取りかからなければならなかったのは各フォーマットのサンプルXMLドキュメントからでした。これらのサンプル・ドキュメントからの生産物であるRELAX NGスキーマを生成するために、Examplotronを使用しました。これによって、私は100時間の労力と、何万ドルをも節約することができました。私は、ドキュメント生成および他の改良コードのためにExamplotronを増大させなければなりませんでした。今後の記事で、この改良コードの独自仕様でない側面を扱うことを望みます。
ExamplotronはRELAX NGスキーマを作り出します。しかし、あなたがW3C XML Schemaを作成しなければならないとしても、すべてはうまくいきます。つまり、RELAX NGをWXSに変換するJames Clark氏の優れたTrangツールを使用することができからです。私は全体的なコンサルティング経験から、現実世界において、サンプル・ドキュメントが最も一般的な形式であるということを知っています、したがって、私は、Examplotronがすぐにも多くの人々への大きな手助けとなると期待しています。
- (非常に読みやすい)仕様書があるExamplotronのホームページを訪れてください。XSLT script that implements Examplotron へのリンクが埋め込まれています。ダウンロードの後にこのスクリプトを「eg-compile.xsl」へ改名することを薦めます。
- ExamplotronスキーマはRELAX NGへコンパイルされます。RELAX NGを学習なさりたい場合は、このチュートリアルを参照してください。またMichael Fitzgerald氏執筆のRELAX NG's Compact Syntaxを参照してください。
- 規則および抽象パターンに基づいた非常に強力なスキーマ言語、Schematronについて知識を得てください。Schematronは、W3C XML SchemaおよびRELAX NGを含む他のスキーマ言語では利用可能でないいくつかの機能を単独で提供することができるので、他のスキーマ言語と共にしばしば使用されます。XSLTユーザをターゲットにしたUche Ogbuji氏のIntroduction to Schematron、また、Chimezie Ogbuji氏のmore general introductionを参照してください。
- W3C XML Schemaについての詳細は、home pageおよびCover pagesを参照してください。
- developerWorks内のDavid Mertz 氏による「XMLの論考」コラムで彼がRELAX NGに関して述べていることを参照してください。
- 3部シリーズの第1回では、RELAX NG図スキーマの構文および意味体系の概観を述べています。(2003年2月)
- 第2回はさらにいくつかの意味的な問題に取り組み、そしてRELAX NGに対応したツールについて述べています。(2003年3月)
- 第3回はRELAX NGとRELAX NGのXML構文フォーム間において、RELAX NG短縮構文と変換に対応したツールについて述べています。(2003年5月)
- 利用可能なXSLTプロセッサーへのリンクがあるW3C XSL Home pageを参照してください。RELAX NGプロセッサーへのリンクに関してRELAX NGホームページを参照してください。
- 様々なXMLスキーマ言語間でトランスレートできるTry James Clark氏のTrangツールを試みてください。
- 著者は、この記事でのXSLTおよびRELAX NG処理に4Suiteを使用しています。4SuiteにおけるRELAX NGサポートはxvifに基づいており、またEric van der Vlist氏によって構築されました。
-
developerWorks XML zone には、そのほかにも多数のXML参考文献があります
-
XMLおよび関連テクノロジー分野におけるIBM認証開発者になる方法については、こちらを参照してください。

Uche Ogbuji氏は、Fourthought, Inc. のコンサルタント兼共同設立者です。この会社は、企業のナレッジ・マネジメントのためのXMLソリューションを専門とするソフトウェア・ベンダー兼コンサルタント会社です。Fourthoughtでは、XML、RDF、およびナレッジ・マネジメント・アプリケーション用のオープン・ソース・プラットフォームである4Suiteを開発しています。Ogbuji氏は、ナイジェリア出身のコンピューター・エンジニア兼ライターで、現在は、米国コロラド州ボールダーに住み、そこで働いています。Ogbuji氏の連絡先はuche.ogbuji@fourthought.com です。