all

2002年10月6日(日)更新


■SGMLのDTDにあった出現指定 "&"

たけち: 今回は、sequece, choiceに続く、第3のモデルグループであるallについて勉強するね。

さらら: それで、その第3のモデルグループって言い方がちょっと気になったんだけれど... (^ ^;

たけち: えっ、なに?

さらら: DTDで (a, b, c....)と書くと「a → b → c →...」になって、それがXML Schemaではsequenceなのよね。

たけち: そうだね。

さらら: それから、(a | b | c |...)と書くと「a または b または c または...」になって、それがXML Schemaではchoiceなのよね。

たけち: そうそう。

さらら: でね。今まで、

さらら

(無指定): minOccurs="1" maxOccurs="1"
?          : minOccurs="0" maxOccurs="1"
+          : minOccurs="1" maxOccurs="unbounded"
*          : minOccurs="0" maxOccurs="unbounded"
 ということを勉強したし、それと、
,        : sequece
|        : choice
 ということを勉強してきたわ。これで合っているわよね。

たけち: そうだね。よく覚えているね。

さらら: あっ、ありがと。でね、XMLのDTDには、これ以外に出現や順番を決めるような記号が思い浮かばないんだけれど..?

たけち: そうだよね。XMLのDTDではこれらの記号で全部だよね。

さらら: それなのに、さらにもう一つ「第3のモデルグループ」があるっていうのがよくわからないの。

たけち: 確かに今回勉強するallは、XMLのDTDにはない考え方なんだ。だけど......... そうだね、次の「DTD」を見てみようか。

■DTD)
    <!ELEMENT poem - - (poet & kana & yomi)>
    <!ELEMENT poet - - (#PCDATA)>
    <!ELEMENT kana - - (#PCDATA)>
    <!ELEMENT yomi - - (#PCDATA)>

さらら: このDTDは変だわ。真ん中に「 - - 」なんて余分なものがついているわ。こんなものをつけたらエラーになるんじゃないの? それに、poet & kana & yomiっていうのも初めて見たわ。なぁに、これ?

たけち: そうだね、これをXMLのDTDとして解釈するとエラーになるよね。でもこれはXMLのDTDではないんだ。実はSGMLのDTDなんだよ。

さらら: SGMLといったら、XMLの元になったマークアップ言語だったのよね。そうでしょ。

たけち: そう。早い話がXMLはSGMLの改良型として生まれたんだ。そしてその改良のほとんどは、SGMLの複雑な機能をなくして簡素化する方向で改良されたんだよね。そういうSGMLからXMLへの改良の中でなくなった機能の一つに、上のような、poet & kana & yomiという書き方があるんだよ。

さらら: これってどんな意味なの?

たけち: そうだね。例えば今まで、
    <poem>
   <poet>額田王</poet>
   <kana>熟田津尓 船乗世武登 月待者 ・・・・・</kana>
   <yomi>熟田津に船乗りせむと月待てば・・・・・</yomi>
   </poem>

 といったXMLデータを扱ってきたよね。これは、

      <!ELEMENT poem - - (poet, kana, yomi)>

 というDTDに従うと、必ず、poet → kana → yomi という順番で出現しないといけないよね。

さらら: そうね。

たけち


■要素の出てくる順番はどうでも良い場合

たけち: ところで、ここで考えて欲しいんだけれど、XMLの場合、こういう順番にこだわらなくても、必要な要素がそろっていれば良いってことがあるよね。たとえば、次のように出てくる順番が違っていても、とにかく必要な要素がそろって居ることが大事だってことがあるよね。

要素の出現順序を問わない場合もあります

さらら: そう言われればそうだわね。

たけち: ところがそういうデータ形式は、「,」sequenceや「|」choiceなどでは、あまりうまく表すことができないんだ。というわけで、SGMLのDTDで使われていたのが「&」なんだよね。

さらら: なるほど。

たけち: (a & b & c &...)という書き方をすると、「aとbとcと...が、順番は関係なく、すべてが出現する」というふうになるんだ。

さらら: ふ〜ん、こういうものがSGMLのDTDにはあったのね。


■XML Schemaの "all"

たけち: というわけで、今までの話がSGMLのDTDについてだったんだけれど、ここから話をXML Schemaに戻すね。

さらら: うふふ。。 (^ ^* たけちが何を言いたいのか検討がついたわ。要するにこのSGML-DTDの「&」、つまり順番は関係なく、すべてが出現するということを表しているのがallなのね。

たけち: そうだね。厳密に言うと、わずかに機能が拡張されている部分もあるけれど、基本はそうなんだ。実際に上のSGMLのDTDに相当するXML Schemaを見てみようね。

■上記DTDに相当するXML Schema
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="poem" type="PoemType"/>

<xsd:complexType name="PoemType">
    <xsd:all>
    <xsd:element ref="poet" />
    <xsd:element ref="kana" />
    <xsd:element ref="yomi" />
    </xsd:all>

</xsd:complexType>

<xsd:element name="poet" type="xsd:string" />
<xsd:element name="kana" type="xsd:string" />
<xsd:element name="yomi" type="xsd:string" />

</xsd:schema>

さらら: ふ〜ん、こんなものなのね。これでXML Schemaは、XMLのDTDよりも便利に使えるというわけなのね。

たけち: ただしこのallには、使う際にいろいろな制約があって、そう気軽に使えるモデルグループではないんだ。allを使う際の制約を以下に列挙するね。

  1. allに含まれるパーティクルはxsd:elementのみに限られる。
    その他のパーティクル、例えばsequenceやchoiceはもちろん、all自身も含めることはできない。
  2. allは他のモデルグループに含まれるパーティクルにはなれない。
    例えば、sequenceの中でallを使うことはできず、必ず複合型定義の中の最外層に存在しなければならない。
  3. allに含まれるxsd:elementパーティクルの出現頻度のmaxOccursの値は1に固定され、それ以外の値をとれない。
    minOccursの値はデフォルトでは1であり、それを0に変更することが許されているだけである。
  4. xsd:all自身の出現頻度もmaxOccursの値は1に固定されており、それ以外の値をとれない。
    minOccursの値はデフォルトでは1であり、それを0に変更することが許されているだけである。
  5. allを使っている複合型を基底型にしてデータ型を拡張(extension)する際、属性の追加こそは許されているものの、内容にパーティクルを追加するような拡張は不可能である。(上記制約から導かれる制約)

さらら: 何かもう制約だらけで、要するに例題にあげたようなパターンでしか使えないということなのね。

たけち: そうだね。だから使う際には、本当にallが必要なのか、sequenceではどうしても駄目なのか、ということを考えてから使った方がいいね。sequeceではどうしても代用できない場合の最後の手段ぐらいに考えておいた方がいいね。

さらら: そうなんだ。

たけち: あとモデルグループについては、この3つでおしまいで、次回は「混在内容」の定義の仕方について説明するね。

さらら: は〜い。

次は混在内容です 。。。。 (^ ^*

さらら


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