要素(モデルグループ)の追加 1/2

2002年10月20日(日)更新


■拡張(extension)

たけち: 以前も話をしたように、「複合型内容をもった複合型」の派生の仕方には制限(restriction)拡張(extension)の2つがあったよね。

さらら: えぇ。

たけち: そして「複合型内容をもった複合型」の場合、まずxsd:anyType型を制限して複合型内容をもった複合型を作るけれども、その場合に、基準型の制限も、それがcomplexContentであることも、外見上は省略できるため、一見まるで派生などは関係ない書き方に見えることも説明したよね。

さらら: そうだったわね。要は、
自分でXMLスキーマのデータ型を定義したければ、必ず他の何らかのデータ型を基準型として、そこから派生させるという形をとらない限り、自分でデータ型を定義することはできない
という基本原則はあるけれど、それが建前だっていうことよね。

たけち

さらら

たけち: そうだね。ただ確かにそういう面もあるけれど、でもそれが建前ではなくて、本当に派生らしい派生を利用したい場合も、やっぱり中にはあるんだよ。今回から、建前ではなくて、派生らしい派生を実際に書いていくことを解説することにするね。

さらら: うん。そういうのが好き。

たけち: というわけで、まずは拡張(extension)の方から話からしていくよ。まず復習だけれど、「単純型内容をもった複合型」では、「拡張(extension)」はどんな機能を持っていたっけ?

さらら: え〜と。。。属性の追加だったわよね (^ ^;

たけち: そうだね、「単純型内容をもった複合型」では「拡張(extension)」は属性を追加するという機能を持っている。さて、これに対して複合型内容をもった複合型ではこの属性の追加の機能も持つと同時に、今度は要素(モデルグループ)の追加という機能も持つんだ。

拡張(extension)

たけち: それでまずは次のXMLデータを見てね。

<poem>
<poet>額田王</poet>
<kana>熟田津尓 船乗世武登 月待者 潮毛可奈比沼 今者許藝乞菜</kana>
</poem>

たけち: これに対応する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="poet" />
<xsd:element ref="kana" />
</xsd:sequence>
</xsd:complexType>

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

</xsd:schema>

さらら: うんうん。これくらいのXML Schemaには慣れたわ。

たけち: さて、このPrePoemTypeを基準型にして、次のXMLデータに対応するような拡張をしたPoemTypeを作ってみるね。

さらら: うん。

さらら

※上記の例を拡張
<poem pno="8">
<poet>額田王</poet>
<kana>熟田津尓 船乗世武登 月待者 潮毛可奈比沼 今者許藝乞菜</kana>
<yomi>熟田津に船乗りせむと月待てば潮もかなひぬ今は漕ぎ出でな</yomi>
<season>冬</season>

</poem>

さらら: あっ、pno属性とyomi要素とseason要素が追加されるのね。

たけち: そうだね。これの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="PoemType"/>

<xsd:complexType name="PoemType">
<xsd:complexContent>
<xsd:extension base="PrePoemType">
<xsd:sequence>
<xsd:element ref="yomi" />
<xsd:element ref="season" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="PrePoemType">
<xsd:sequence>
<xsd:element ref="poet" />
<xsd:element ref="kana" />
</xsd:sequence>
</xsd:complexType>

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

</xsd:schema>


■モデルグループを追加して拡張

たけち: ここで見てほしいのは、次の個所なんだ。

<xsd:complexType name="PoemType">
<xsd:complexContent>
<xsd:extension base="PrePoemType">
<xsd:sequence>
<xsd:element ref="yomi" />
<xsd:element ref="season" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>


まず、

<xsd:extension base="PrePoemType">

 という書き方で、これがPrePoemTypeを基準型に拡張することを意味しているんだ。そしてその中に
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />

 という属性の追加が書いてあるけれど、こういう属性の追加は以前説明したことだから、これは今は特に説明しなくても良いよね。

さらら: えぇ。。(なんとなくだけれど (^ ^;) )

たけち: そして、今回一番見てほしいところが、次のモデルグループなんだ。

※拡張のために追加したモデルグループ
<xsd:sequence>
<xsd:element ref="yomi" />
<xsd:element ref="season" />
</xsd:sequence>

たけち: 「複合型内容をもった複合型」では、このような拡張で結果として作られる内容モデルはつぎのように書くんだ。

拡張(extension)された内容モデルの書き方

たけち: だからこの例題だと、結果として作られる内容モデルは、つぎのように、

<xsd:sequence>
    <xsd:sequence>
    <xsd:element ref="poet" />
    <xsd:element ref="kana" />
    </xsd:sequence>

    <xsd:sequence>
    <xsd:element ref="yomi" />
    <xsd:element ref="season" />
    </xsd:sequence>

</xsd:sequence>

 となるんだけど、これは結局、つぎの記述と同じ意味になるよね。 <xsd:sequence>
    <xsd:element ref="poet" />
    <xsd:element ref="kana" />
    <xsd:element ref="yomi" />
    <xsd:element ref="season" />
</xsd:sequence>

さらら: ふ〜ん、なるほどね。

さらら

要素(モデルグループ)の追加 2/2につづきます 。。。。 (^ ^*


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