2002年9月29日(日)更新 |
■データ型と派生
たけち: 今回から、ついにスキーマらしいスキーマである複合型内容を持つ複合型の話に入るね。 さらら: は〜い (^ ^) たけち: まずは今までの復習なんだけれど、単純型や単純型内容を持つ複合型では、どういうふうに派生の方法があったか覚えてる? さらら: え〜と。。。単純型は、制限(restriction)とユニオン(union)とリスト(list)の3種類だったわよね。それと単純型内容を持つ複合型は制限(restriction)と拡張(extension)だったわ。 たけち: そうだね。それで複合型内容を持つ複合型の派生のさせ方なんだけれど、これも制限(restriction)と拡張(extension)の2種類があるんだよ。図にするとこういう感じだね。この図はすごく大事だから、まずはこれをしっかり覚えてね。 |
■複合型内容を持つ複合型の制限(restriction)
さらら: あら、よく見たら、単純型内容を持つ複合型も複合型内容を持つ複合型も、どちらも制限と拡張しかないのね。結局「複合型」には「制限」と「拡張」の2種類があると覚えてしまえば、それでいいんじゃないの? たけち: うん。この図だけ見ると、一見そういうふうに見えるよね。でも、実はそこに落とし穴があるんだよね。 さらら: え? 落とし穴? たけち: 単純型にしても「単純型内容を持つ複合型」にしても、その「内容」については、制限(restriction)を使う際には、制約ファセットという形で、元になるデータ型をどう制限したいかということを定義していたよね。 さらら: えぇ。。 たけち: ところが、複合型内容を持つ複合型における制限(restriction)というのは、その「内容」については「どう制限したいか」ではなくて、制限された結果どうなるかを定義するんだよ。 さらら: はにぁ???? たけち: 確かにこんな話じゃわからないよね (^ ^; 実際に実例を見てみよう。 |
■複数の要素を子要素にもつXMLドキュメントの例 |
たけち: このようなXMLドキュメントのスキーマを考えてみよう。 でも、その前にまずこれのDTDを書いてみようか、ねっ、さらら。ちなみに歌の作者(poet)は分からないこともあるから、出現してもしなくてもいいオプション扱いにしておこうね。 さらら: え〜っ (^ ^; う〜んと・・・・こっ、こうかしら。。 (^ ^; |
■DTD by さらら |
たけち: そう、こうだよね。さてこれからXML Schemaを書こうと思うけれど、XML Schemaには、 さらら: そうだったわね。(^ ^; たけち: じゃあ、上記のような構造を持ったデータ型を定義しようと思ったら、どういう基準型を使えば定義できるんだろうね? |
■xsd:anyTypeを基準型にして制限(restriction)
さらら: え〜っ、皆目検討がつかないわ。こんな風に要素がたくさんあるデータ型って知らないもの。。。。 たけち: そうだよね。ちょっと普通思い浮かばないよね (^ ^; そこでXML Schemaを策定した人達が考えたことなんだけれど... xsd:anyTypeというビルトインデータ型を覚えているかい? 単純型だろうが複合型だろうが、どんなデータ型でもマッチするという、何でもありのデータ型だよ。 さらら: そういえば、そういうものがあったわね。 たけち: この例では、この何でもありのxsd:anyTypeを基準型にして、それを制限(restriction)するんだよ。 さらら: はぁ??? ... (?.?) たけち: うん。。。まずは、例をみてみようね。 |
■poem例のXML Schema(複合型内容をもつ複合型) |
たけち: この中で、次の個所が、基準型であるxsd:anyTypeを制限した結果どうなるか、ということを示している部分だよ。 |
■xsd:anyTypeを制限した結果を示す部分 |
たけち: <xsd:attribute name="pno" type="xsd:positiveInteger"/> さらら: へ〜っ、そうなの。でも、sequenceとか知らない言葉が出てきているわ。これが内容を表すの? たけち: あっ、そうだね。じゃ、まずは基本的な言葉について紹介しておくね。 |
■内容モデルとモデルグループ
たけち: この複合型の内容をもつ複合型の、内容がどんな要素やテキストで構成されているかを示す部分を内容モデルっていうんだ。 さらら: この例では、sequenceの個所のこと? たけち: そうだね。で、その内容モデルを構成する部品として要素の出現の仕方を指定するものをモデルグループっていうんだ。つまり、モデルグループを使って内容モデルを規定するんだね。 さらら: どんな風に決めるの? たけち: モデルグループには、sequence, choice, allという3種類が使えるんだ。この例では、sequenceを使っているね。 さらら: どういう意味なの? たけち: sequenceは、一連の、一続きの、順番に、とかいった意味だよ。だから、さっき言ったように、DTDの |
たけち: このsequenceだとかminOccurs="0"だとかいった、その他詳しいことは、次回に説明するから今は無視してね。今回はあくまで複合型内容をもった複合型の定義の基本をわかってもらいたいだけだから。 さらら: う〜ん、それにしてもxsd:anyTypeを制限した結果としてこんな書き方するなんて.......... たけち: そう、restriction要素の内容は制限された結果どうなるかを表しているんだ。それで、ここでだいぶ先走ってしまうけれど、このPrePoemTypeからpoet要素を省くようにさらに制限してみようね。 さらら: えっ、.......... (・・) たけち: DTDでいうと |
■poem例のXML Schema(複合型内容をもつ複合型) |
たけち: これを見てわかるように属性の宣言については、派生型であるPoemTypeの定義の中には書いていないよね。前回も勉強したように、属性は制限する際に何も変更することがなければ、何も書かなくてもいいことになっているからなんだ。これに対して「内容」である「内容モデル」については制限された結果どうなるかということを必ず書かないといけない。このために さらら: .......... (・・) たけち: あっ、図で確認しておこうね。 |
たけち: こんなふうに制限する場合は、制限された結果どうなるかということを書かないといけないんだよ。 さらら: .......... |
■空要素の書き方
たけち: そして以前説明したことだけれど、単純型や「単純型内容を持つ複合型」は、制限の「内容」として、「どう制限したいか」ということを書くことになっているから、そこに何も書かなければ、基準型と何も変わらないという意味になる。 さらら: .......... たけち: <kara /> |
■空要素のXML Schema |
さらら: たけち・・・・ たけち: えっ? さらら: あのぉ・・・さっきから話を聞いていて、ものすごく違和感があるんだけれど・・・・(- -; たけち: えっ、なっ、なに? (^ ^; 気まずい雰囲気の中、 |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |