複合型内容をもった複合型の制限(2)

2002年11月3日(日)更新


■複合型内容をもった複合型の制限

たけち: 前回は「複合型内容をもった複合型の制限」における、「要素に使用されている単純型の値の範囲を狭める」という機能についての話をしたよね。

さらら: えぇ。

たけち: 「複合型内容をもった複合型の制限」には4つの機能があったけれど、覚えている? (^ ^;)

さらら: えっ... (^ ^;

たけち: 次の4つだね。

さらら

複合型内容をもった複合型の制限(restriction)

たけち: このうち、1と2については「単純型内容をもった複合型の制限」で説明したこととまったく同じだから説明は省いたよね。そして4については前回説明したね。というわけで、今回は残った一つ、3の「要素の出現制約を強化」について説明するよ。まずは前回と同様の例題を出してみるね。

※反歌を伴う長歌の例
<?xml version="1.0" encoding="Shift_JIS" ?>
<poem>
<pno>4089</pno>
<envoy>4090</envoy>
<envoy>4091</envoy>
<envoy>4092</envoy>
<poet>大伴家持</poet>
<yomi>高御座 天の日継と すめろきの 神の命の 聞こしをす 国のまほらに 山をしも さはに多みと 百鳥の 来居て鳴く声 春されば 聞きのかなしも いづれをか 別きて偲はむ 卯の花の 咲く月立てば めづらしく 鳴く霍公鳥 あやめぐさ 玉貫くまでに 昼暮らし 夜わたし聞けど 聞くごとに 心つごきて うち嘆き あはれの鳥と 言はぬ時なし</yomi>
</poem>

たけち: これに対するXML Schemaは次のようだったね。

※反歌を伴う長歌のXML Schema
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

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

<xsd:complexType name="PrePoemType">
<xsd:sequence>
<xsd:element ref="pno" />
<xsd:element ref="envoy" minOccurs="0" maxOccurs="10" />
<xsd:element ref="poet" minOccurs="0"/>
<xsd:element ref="yomi" />
</xsd:sequence>
</xsd:complexType>

<xsd:element name="pno" type="xsd:positiveInteger" />
<xsd:element name="envoy" type="xsd:positiveInteger" />
<xsd:element name="poet" type="xsd:string" />
<xsd:element name="yomi" type="xsd:string" />

</xsd:schema>


■出現制約の強化

たけち: 今回はローカル要素宣言を持ち出さなくても説明できることだから、今まで見慣れたこの形で話を進めていくことにするね。さてここでpno, envoy, poet, yomiの4つの要素が出現しうる回数のリストを見てみることにするね。

さらら: 要素が出現しうる回数のリスト??

たけち: そう。まず省略されている出現回数の設定についても書くと、各要素はこうなっているよ。

たけち

XMLデータ例の要素の出現回数

さらら: あ、そうね。。。。

たけち: そして、制限するということ、つまり「出現制約を強化」するというのはどういうことかというと、このリストの幅を狭くする、ということだよ。

さらら: へっ??

たけち: あっ、ごめん (^ ^;) 口に出して言うと難しそうだけれど、次のように書くとわかってもらえるかな。

たけち

要素の出現制約を強化する例

さらら: あっ、そういうことなのね・・・

たけち: まずpnoやyomiは、最低出現回数も最高出現回数も1回のみ、つまり1しか存在しないよね。そのためこれをいくら制限したくても、この1以外にとりようがなくて、まったく制限できないんだ。
 それに対して、poetは0と1の2つがあるから、これを0のみに制限することもできれば、1のみに制限することもできるね。この2通りのパターンがあるんだ。まったく変わらないことも含めると3通りのパターンということになるね。

さらら: えぇ。

たけち: さて多くのパターンがあるのがenvoyで、最低出現回数が0で、最高出現回数が10ということは、0から10までの11個があるということだよね。これを制限するやり方は、一応ここに7通りのパターンだけ載せているけれど、本当は65通りのパターンがあるんだ。何も変えていない最後のパターンを含めると66通りのパターンだね。

さらら: うわぁ〜。たくさんあるのね。

たけち: ちなみに今回は、minOccurs="unbounded"、つまり最高出現回数が無制限、無限大の場合については出さなかったけれど、こうなってくると制限しうるパターンも無限大にあるよね。

さらら: ふ〜ん。こんなふうに考えるのね。

たけち: これらの制限したパターンを、もう一度minOccurs, macOccursであらわすと、次のようになるね。

たけち

要素の出現制約を強化する例

さらら: はぁ〜・・・・・

たけち: ここで注意してほしいのは、0しか存在しない場合、つまり最低出現回数も最高出現回数も0ということは、存在しない、ということだよね。ということは、minOccurs="0" maxOccurs="0"、とわざわざ書かなくても、内容モデルの中から削除してしまえばそれでよいということだよ。

さらら: あ、それはそうね。

たけち: だから例えば、先ほどの例題だと、pnoとyomiに関しては「出現制約の強化」はできないね。それに対して、envoyは最低出現回数を2、最高出現回数を7に制限してみようね。そして、poetに関しては0のみに制限、つまりその存在そのものを削除してしまおうね。これはこんなふうに書けるんだよ。

たけち

※反歌を伴う長歌の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:complexContent>
<xsd:restriction base="PrePoemType">
<xsd:sequence>
<xsd:element ref="pno" />
<xsd:element ref="envoy" minOccurs="2" maxOccurs="7" />
<xsd:element ref="yomi" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="PrePoemType">
<xsd:sequence>
<xsd:element ref="pno" />
<xsd:element ref="envoy" minOccurs="0" maxOccurs="10" />
<xsd:element ref="poet" minOccurs="0" />
<xsd:element ref="yomi" />
</xsd:sequence>
</xsd:complexType>

<xsd:element name="pno" type="xsd:positiveInteger" />
<xsd:element name="envoy" type="xsd:positiveInteger" />
<xsd:element name="poet" type="xsd:string" />
<xsd:element name="yomi" type="xsd:string" />

</xsd:schema>

さらら: ふんふん。。

たけち: 前回も説明したように、「複合型内容をもった複合型」の内容モデルを制限したい場合には、制限された結果どうなるかということを書かないといけない。だから、基準型と派生型のそれぞれの内容モデルを見比べてほしいけれど、

※基準型 [PrePoemType]
<xsd:sequence>
<xsd:element ref="pno" />
<xsd:element ref="envoy" minOccurs="0" maxOccurs="10" />
<xsd:element ref="poet" minOccurs="0" />
<xsd:element ref="yomi" />
</xsd:sequence>

※派生型 [PoemType]
<xsd:sequence>
<xsd:element ref="pno" />
<xsd:element ref="envoy" minOccurs="2" maxOccurs="7" />
<xsd:element ref="yomi" />
</xsd:sequence>

たけち:  というふうに書いているということだよ。pnoとyomiについては変えようがなかったこともあって、そのまま同じ書き方をしている。それに対して、envoyは出現回数を、0回〜10回から、2回〜7回へ制限しているね。そして、poetにいたっては、0回または1回だった出現回数を、0回のみに制限、つまり存在を削除してしまったので、この内容モデルの中からも消えてしまった、ということだね。

さらら: なるほどねぇ〜。こんな考え方をするのね。

たけち: これで複合型内容をもった複合型の制限の説明を終わるけれども、わかってもらえたかな? (^ ^)

さらら: だいたいわかった気がするわ (^ ^;

たけち: 次回は「抽象的なデータ型、抽象要素」について勉強するね。

次は、抽象的なデータ型、抽象要素です 。。。。 (^ ^*

さらら

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