mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
今回は,XML文書の文書型定義を表わすためのボキャブラリについてお話しします。「文書型」とは,文字通り「文書の型」であり,その概念は,XMLの元となるSGMLで生み出されたものです。
では「型(かたち)」とはどういうものか,と改めて考えてみましょう。例えば,売上伝票や請求書といった文書では,記入すべき項目を罫線で囲んで,日付とか金額といった項目名が示されています。私たちは,そうした記入のかたちが定まっている文書をXMLが登場する以前から「定型文書」と呼んでいました。ちなみに「定型文書」は「定形文書」ではありません。「形(かたち)」は具体的に「2007年2月3日」とか「3億円」といった外見上の姿を指す言葉です。一方,「型(かたち)」は原型とか型紙というように,「日付」とか「金額」というモノの容れ物を指す言葉です。
「型」という概念が盛んに使われているのがプログラミングの世界です。そこでは処理対象であるデータの容れ物を「データ型」と呼んでいます。例えば,Java言語では,文字を表わす「char型」,整数を表わす「int型」といった「基本型」があります。文字列,配列,文書などのデータの容れ物は幾つかのそうした基本型の集まりであるとして,その容れ物を「参照型」と呼んでいます。「参照型」はさらに「class型」「interface型」「array型」に分かれています。Java言語では,このようにデータの容れ物を厳密に定めることによって,誤りの生じにくい表現でプログラムを書けるようにしています。
さて「文書型」の話に戻りましょう。文書型では,文書を構成する部品であるデータのデータ型と,データどうしの関係について語ることになります。ここでデータどうしの関係とは,構成するデータが複数ある場合に,それらの順序や階層のことを指します。例えば,メチャクチャに書かれたメモ書きのような文書でも,それなりの「文書型」があり,それは「定型」であると考えます。文書を構成する部品を「要素」と言い,要素は「属性」と「内容」を持てるとしています。
ここで,身近な名刺を例にとりあげましょう。図1に名刺の例を示します。このような名刺を何枚か集めた名簿を想定してください。そうした名簿を表わすXML文書(正確には,XML文書インスタンス)は,図2のようになるでしょう。これは「整形式の文書」と呼ばれるものです。名簿についてのSGMLによる文書型定義(DTD:Document Type Definition)を図3に示します。図3の意味は次のようになります。
▼図1 名刺
▼図2 名簿の文書インスタンス
<名簿>
<名刺>
<名前><姓>桃</姓><名>太郎</名></名前>
<会社名>オタカラ商事</会社名>
<住所>瀬戸内海鬼ガ島</住所>
<メール>taro@onigashima.com</メール>
<ロゴ 画像="momo.png" />
</名刺>
<名刺>
<名前><姓>金</姓><名>太郎</名></名前>
<会社名>金時山茶屋</会社名>
<住所>金時山大字峠之垰</住所>
<メール>taro@kintoki.com</メール>
</名刺>
</名簿>
▼図3 SGMLによる文書型定義
<!DOCTYPE 名簿 [
<!ELEMENT 名簿 (名刺+)>
<!ELEMENT 名刺 (名前, 会社名, 住所, メール, ロゴ?)>
<!ELEMENT 名前 (姓, 名)>
<!ELEMENT 姓 (#PCDATA)>
<!ELEMENT 名 (#PCDATA)>
<!ELEMENT 会社名 (#PCDATA)>
<!ELEMENT 住所 (#PCDATA)>
<!ELEMENT メール (#PCDATA)>
<!ELEMENT ロゴ EMPTY>
<!ATTLIST ロゴ 画像 CDATA #REQUIRED>
]>
「名簿」という文書型(DOCTYPE)は「名簿」要素(ELEMENT)であるとします。その内容は「名刺」要素が幾つか繰り返されたものです。「+」記号がそれを表わしています。「名刺」要素の内容は,「名前」「会社名」「住所」「メール」「ロゴ」の各要素が順次並んだものです。「,」記号がそれを表わしています。同様に「名前」要素の内容は「姓」「名」の各要素が順次並んだものです。
「(」記号と「)」記号で囲んだ部分を「内容モデル」と言います。ここで「名前」は親要素,「姓」「名」は子要素の階層関係にあると言います。「姓」「名」「会社名」「住所」「メール」の各要素の内容は文字列(#PCDATA)です。
図2の「金太郎」の名刺には「ロゴ」要素がないことに注目してください。「ロゴ」要素に付けた「?」記号はその要素が省略可能であることを表わしています。逆に図2の「桃太郎」の名刺には「ロゴ」要素があります。それには内容が無く(EMPTY),かつ「画像」という文字列(CDATA)で表わす必須(#REQUIRED)の属性を持っています。このようにして文書型を定義することになります。
このSGMLに基づく文書型定義(DTD)によって文書型を表わす方法がXMLの応用で問題になることがあります。DTDでは,要素の内容のデータ型は文字列(#PCDATA)しか指定できません。また属性のデータ型は幾つかありますが,XMLの応用(とくに電子商取引)で求められる日付,数量,金額,URLなどといった様々なデータを表わすには向いていません。と言うのも,SGMLの応用が本や報告書であったためです。そこで登場してきたのがDTDに代わる新しい文書型定義のボキャブラリであるXML SchemaとRELAX NG(邦訳)なのです。
XML Schemaは,W3Cで開発され,2004年に勧告になった文書型定義のボキャブラリです。XML Schemaは,多機能ですが,それだけに複雑な書き方になっています。ここでは,その概略を述べることは紙面の関係で到底できそうにありませんので,とりあえず図3のSGMLによる文書型定義がXML Schemaでどのように表わされるかを示しましょう[図4を参照]。図4は何とも長たらしい表現ですが,子要素や属性を持つ要素をcomplexTypeで定義することに注目すると,図3の内容モデルと容易に対応できるでしょう[表1を参照]。
▼図4 XML Schemaによる文書型定義
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="名簿">
<complexType>
<element name="名刺" minOccurs="1" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="名前">
<complexType>
<sequence>
<element name="姓" type="string"/>
<element name="名" type="string"/>
</sequence>
</complexType>
</element>
<element name="会社名" type="string"/>
<element name="住所" type="string"/>
<element name="メール" type="anyURI"/>
<element name="ロゴ" minOccurs="0">
<complexType>
<attribute name="画像" type="anyURI" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
</element>
</complexType>
</element>
</schema>
▼表1 DTD,XML Schema,RELAX NGの対応
DTD | XML Schema | RELAX NG |
---|---|---|
ELEMENT | element | element |
ATTLIST | attribute | attribute |
内容モデルの「,」 | sequence | |
内容モデルの「*」 | minOccurs="1" | oneOrMore maxOccurs="unbounded" |
内容モデルの「?」 | minOccurs="0" | optional |
内容モデルの「#PCDATA」 | string | string |
内容モデルの「EMPTY」 | empty | |
CDATA | string | string |
#REQUIRED | use="required" |
私は,XML SchemaをGUIを使って生成・編集できるエディター「XMLSchemaEditor」をジャストシステム社のxfyで開発し公表しました[5]。実際に,XML Schemaの学習は面倒ですが,このツールが学習の助けになれば作者として幸甚です。ぜひお試しください。
RELAX NGは,XML世界で有名な村田 真氏とJames Clark氏によって開発され,2001年にOASISで標準された文書型定義のボキャブラリです。さらにRELAX NGは,ISO/IEC 19757で策定中の文書スキーマ定義言語(DSDL:Document Schema Definition Languages)の1部となっています。
ここでは,XML Schemaの場合と同様に,図3のSGMLによる文書型定義がRELAX NGでどのように表わされるかを示しましょう[図5を参照]。これはXML Schemaに比べると,ずいぶんスッキリした表現になっていることが分かるでしょう。これは図3の内容モデルと容易に対応できるでしょう[表1を参照]。面白いことに,RELAX NGのデータ型はXML Schemaを参照しています。
▼図5 RELAX NGによる文書型定義
<?xml version="1.0"?>
<element name="名簿" xmlns="http://relaxng.org/ns/structure/1.0">
<oneOrMore>
<element name="名刺">
<element name="名前">
<element name="姓"><data type="string"/></element>
<element name="名"><data type="string"/></element>
</element>
<element name="会社名"><data type="string"/></element>
<element name="住所"><data type="string"/></element>
<element name="メール"><data type="anyURI"/></element>
<optional>
<element name="ロゴ">
<attribute name="画像"><data type="anyURI"/></attribute>
</element>
<empty/>
</optional>
</element>
</oneOrMore>
</element>
印刷業がどのボキャブラリを学ぶべきかは一概に言えません。SGML文書の場合は,必ずDTDが含まれ,それだけに集中すれば処理ができました。ところが,XML文書の場合は,DTDが含まれる文書(妥当な文書)と,DTDが含まれない文書(整形式の文書)の利用が許されており,さらに,XML SchemaとRELAX NGという新しい文書型定義が加わりましたので,何とも面倒な話です。
とりわけXML SchemaやRELAX NGの背景には,XML文書のデータ型を詳細に指定することによって,それを処理する(その多くはJava言語で表わされた)プログラムを自動的に生成しようという企てがあり,現在多様なツールが公開されています。そうしたことを従来の印刷の範囲を超えることと見るか,あるいは,これからの印刷では積極的に引き受けていくべきと見るか,重大な選択になると思います。結局のところ,どちらも学ぶ必要がありそうに思えますが,いかがなものでしょうか。
今回の話は,XMLの基礎に関わることでしたので,長々と書き綴ってしまいました。次回は,再び応用のボキャブラリに戻ることにしましょう。
▲このページのTOPへ