要素のデフォルト値と固定値

2002年9月22日(日)更新


■要素のデフォルト値と固定値

たけち: 単純型内容をもった複合型の話が終わって複合型内容をもった複合型の話をこれからしないといけないところなんだけれど、その合間を利用して、今回はちょっと横道にそれて要素のデフォルト値と固定値の話を今回はしてみるね。

さらら: え〜と、それで不思議に思ったんだけれど... DTDに要素のデフォルト値とか要素の固定値ってあったのかしら。

たけち: 確かに属性のデフォルト値、属性の固定値はDTDにあるけれど、要素のデフォルト値とか要素の固定値ってDTDにはないよね。だから今までしてこなかったという面があるんだね。でも属性のデフォルト値の話をいろいろと解説した後だから、この話をしてもいいかな、と思ったんだ。

さらら: そう。XML Schemaにはそういうものがあるのね。

たけち

たけち: うん。XML SchemaをDTDと比較してみると、要素と属性が比較的平等に扱われているように思われるんだよね。もちろん、これはあくまで僕の個人的主観的な感想なんだけどね。実際には、XML Schemaの仕様書に「要素と属性は平等に扱われなければならない」と書いてあるわけじゃあないんだけど。。。。見ていてそのことはどうしても感じてしまうね。

さらら: へぇ〜。たとえば、どんなこと?

たけち: 例えば、DTDだと、データ型が属性では使えても要素では使えなかったね。これに対してXML Schemaでは要素も属性も同じ単純型が使えるようになっているよね。

さらら: あ、なるほどね。

たけち: もっとも、NMTOKEN型やID型のように、属性では使えて要素では使うべきではない単純型もあるけれど、それはあくまでDTDと互換性を保つためにそうしているんだね。こんな風に、XML Schema本来の仕様をみると、結構平等に扱われているようなところがいくつもあるんだ。

たけち: 話をさらに脱線させると、RELAX NGという別のスキーマ言語では、この平等感がさらに強くなって、要素と属性の本質的な仕様の違い以外は、ほぼ同じ方法で書けるようになっているんだよ。

さらら: RELAX NG??

たけち: あっ、いまは気にしないで。。。 (^ ^;

さらら: えっ、えぇ。。。でも、どうしてこうもDTDとXMLスキーマだとデータ型の扱いが違うのかしら・・・

さらら


■SGMLとXMLとでは応用範囲が違う

たけち: そうだねぇ〜。DTDはSGMLのときに作られたってことがヒントになるかな。

さらら: あっ、SGMLってのがあったのよね。

たけち: DTDが最初に作られたSGMLの時代というのは、その用途が主にドキュメントだったんだよね。とくに、電子ドキュメントの交換フォーマット、という考え方が強かったんだ。

さらら: そうなの。

たけち: そして、SGMLドキュメント処理というのは、どちらかというとドキュメントの表示や印刷、ということが中心だったんだね。

さらら: それだと、いまとどう違うの?

たけち: ドキュメントの交換、表示や印刷ができればいいんだったら、要素の内容のデータ型なんかは、文字列やイメージなんかで十分だよね。要素の内容に基づいて、なにか計算したり、データベースにデータを登録したりするわけじゃないから。

さらら

ドキュメントの要素の内容はテキストで十分だった

さらら: あぁ、そっか〜。じゃあ、属性は?

たけち: たとえば、ID属性なんかは、ドキュメント内で共通的に参照されるような要素、たとえば用語の説明、注意事項、商品説明図だとかの要素につけたりすることがあったね。で、ドキュメントの表示のときに、それらの要素を参照している個所をクリックするとそれらを別のウィンドウに表示したりね。


■XMLになると応用範囲が一気に広がった

たけち: つまり、要素はドキュメントの内容そのものを示して、属性は、ドキュメントの表示や印刷処理のために必要な付加的な情報という色合いがあったんだね。

さらら: そうだったの。。。

たけち: ところが、XMLになると、その応用範囲が一気に広がったんだよね。取引処理に代表されるような数値データ処理や、データベースと深くかかわる帳票の入出力なんかにもXMLが使われはじめたんだよ。そうなると、SGMLの時と事情が違ってきて、ドキュメント要素の内容はデータ型をきちんと意識しないといけなくなったんだよね。

ビジネスデータ処理に使われるXMLドキュメントの要素は厳密なデータ型が必要

さらら: そうなんだ〜。

たけち: そうして、いろいろな応用の視点から、要素も属性も同じように扱えるようにしたいという要請がでてきたんだと思われるんだよね。そしてそういう流れの中で、XML Schemaでは、属性にデフォルト値や固定値が使えるのと同様、要素にもデフォルト値や固定値を使えるようにしようという話になってきたと推測できるんだね。業務システムなどで扱うデータには、デフォルト値や固定値が使えるのは、ごくあたりまえのことだからね。

さらら: なるほどねぇ〜。

さらら


■要素のデフォルト値と固定値の例

たけち: というわけで、実際の例を見てみようね。たとえばね、

      <emotion>恋愛</emotion>
とか
      <emotion>追悼</emotion>

とかいった書き方で、内容がない場合、つまり

      <emotion />

とした場合に、その内容の値は実は恋愛だということを宣言するXMLスキーマの書き方はつぎのようになるんだよ。

たけち

■要素内容のデフォルト値を指定する例
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="emotion" type="xsd:string" default="恋愛" />

</xsd:schema>

たけち: それから、
      <emotion>恋愛</emotion>
 という書き方以外に許されない場合は、つぎのようになるんだよ。

■要素内容を固定にする例
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="emotion" type="xsd:string" fixed="恋愛" />

</xsd:schema>


■デフォルト値について気をつけること

さらら: な〜んだ。よくみると、属性のデフォルト値や固定値の設定の仕方とまったく同じじゃないの。

たけち: そうだね...(^ ^; このことからも要素と属性が比較的平等に扱われているということがわかるよね。
ただ、要素のデフォルト値と属性のデフォルト値の違いなんだけれど、属性では、その属性の出現がない場合に、実はその属性が存在して、その値がデフォルト値なんだ、とされていたよね。

さらら: えぇ。

たけち: ところがそれに対して要素では、その要素が出現しないような状態では、それは単に要素が存在しないとみなされる。そして、要素が存在して、かつその内容が空の場合に、そこにデフォルト値が存在すると解釈されるんだ。

さらら: 内容が記載されていない要素について、デフォルト値が使われるのね。

たけち

たけち: それとこのデフォルト値の設定などは、要素宣言からは設定できるけれど、「複合型内容をもった複合型」などで使うグローバル要素の参照などからは設定できない。あくまで要素の宣言からのみ使える設定なんだ。

さらら: えっ? 何のことか、意味がわからないわ。

たけち: あ、ごめん。今言ったことの意味はじきにわかってくるようになるからね。 (^ ^;

さらら: それにしても、<xsd:element>にuse属性なんかがあったら、要素宣言ってほとんど属性宣言と同じよね。

たけち: そうだねぇ。確かに要素宣言にはuse属性は存在しないのだけれど、ただしそれに代わるものとして、minOccurs属性とmaxOccurs属性が存在するんだ。これについては次の次くらいに説明するね。今日はこれでおしまい。

さらら: は〜い。

複合型内容を持つ複合型の定義の基本につづきます 。。。。 (^ ^)v

さらら


XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。