単純型内容を持った複合型 - 定義の基本

2002年8月25日(日)更新


■複合型

さらら: ねぇ、たけちぃ。今までたくさん勉強してきた気がするけれど、よ〜く考えたら、DTDでいうと
<!ELEMENT a (#PCDATA)>
という形しか勉強していないんじゃない?

たけち: ぎくっ..... (^ ^; う〜ん、確かに単純型のデータ型というDTDにない部分を特に詳しく勉強してきたから、今ひとつ「スキーマの勉強をしている」という感じがもてなかったかもしれないね。でも今回から複合型の勉強をしていくから、少しずつ「スキーマの勉強をしている」という感じが出てくると思うよ。

さらら: 単純型というのは内容にテキストを持つもので、複合型はそうじゃないものよね。

たけち

たけち: う〜ん、それは厳密には正しくないんだ。内容にテキストを持つものでも属性などを持っているのは複合型になるんだよ。そういうデータ型は属性の宣言には使えないからね。

さらら: あ、そっ、そうだったわね ..... (^ ^;

たけち: でも今、さららの指摘した部分というのはすごく重要な点なんだよ。複合型の派生のさせ方を考える際に、内容がテキストなのかそうでないのか、というのは大きな違いを生むんだ。だから複合型は以下のように分類できるんだよ。

複合型の分類


■単純型内容を持った複合型

さらら: 単純型内容を持った複合型って何なの?

たけち: 言葉で言うと難しく感じたかもしれないけれど、さっき言った内容はテキストだけれども、属性を持っているというデータ型だよ。

 <yomi pno="8">熟田津に船乗りせむと月待てば潮もかなひぬ今は漕ぎ出でな</yomi>

 という要素がそれにあたるよね。DTDにすると、

 <!ELEMENT yomi (#PCDATA)>
 <!ATTLIST yomi pno CDATA #REQUIRED>

 という形なんだね。

さらら: こういう形をとるデータ型を単純型内容を持った複合型って言うのね。

たけち: そう。そしてこの単純型内容を持った複合型は、複合型なんだけれども、単純型に近い複合型として特別扱いされているんだよ。単純型の特徴を残した複合型というところかな。
哺乳類なんだけれども、卵を生むという爬虫類のような特徴を残しているカモノハシみたいな存在だね。それに対して複合型内容を持った複合型というのは、複合型らしい複合型、真の複合型という感じの存在だね。

さらら: えっ、カモノハシ? 万葉の頃の日本に、カモノハシっていないんだけど・・・・どうしてたけちは知っているの?

たけち: あっ...(^ ^; いや...

さらら: ... (^ ^* それはそうとして、この形式のXMLスキーマが前にも出てきたわよね。

たけち: そう、これのXMLスキーマは以下のようになるんだね。

たけち

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="yomi" type="YomiType" />

<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
<xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

</xsd:schema>


■simpleContent, complexContent

たけち:  まず今まで単純型で
 <xsd:simpleType name="....">
というパターンをずっと定義してきたけれど、複合型ではこれが
 <xsd:complexType name="....">
という形になるんだ。これはわかるよね。

さらら: えぇ。

たけち: 次にさっきも言ったように、複合型の分類では、内容がテキストなのか、つまり単純型内容(Simple Content)を持っているのか、それともそうじゃない複合型内容(Complex Content)を持っているのか、ということが大きな違いになってくるんだ。そのために、ここでは単純型内容(Simple Content)を持ったものを定義しているんですよ」という意味で、
 <xsd:simpleContent>
という要素が必要になるんだよ。

さらら: ということは、複合型内容(Complex Content)を持った複合型を定義する場合には、ここが
 <xsd:complexContent>
になるの?

さらら

simpleContentとcomplexContent


■拡張(extension)

たけち: そう、そのとおりだよ。ただ、その話はまた後でするね。で、次に内容がxsd:string型なんだけれど、そのxsd:string型がとる範囲を制限(restriction)して派生させるわけじゃないよね。属性というさらに余分なものがくっつくわけだから、これは拡張(extension)しているんだ。そこで、
 <xsd:extension base="xsd:string">
と書いているんだよ。つまりこれはxsd:string型を基準型として、そこから拡張(extension)して派生させますよという意味になるんだ。

さらら: 制限(restriction)じゃなくて、拡張(extension)なのね。制限(restriction)はこういう場合には使えないわけなのね。

たけち: そうなんだよ。ただ、制限(restriction)で「単純型内容を持った複合型」を定義する方法がまた別にあるんだけど・・・・・

さらら

さらら: えっ?

たけち: あ、ごめん...(^ ^; これについては後で説明することにするね。今はこの例題の説明を続けようね。最後に属性なんだけれど、

<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />

となっているよね。これは属性の宣言で、要素の宣言と基本的に変わらないよね。少し違うのはuseという属性があることで、 use="required"は「属性をつけることが絶対必要」という意味なんだよ。DTDで言うと、
 <!ATTLIST yomi pno CDATA #REQUIRED>
の#REQUIREDと意味は同じだよ。

さらら: なるほど、そういうことなのね。

たけち: 次回はこの属性の宣言について詳しく勉強しようね。

さらら: は〜い。

→ 次回は、属性の宣言です。。。。 (^ ^)v

さらら


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