2002年11月10日(日)更新 |
■派生について(復習です)
たけち: さっそくだけど、以前、子要素の多い例として、こんな例を出したよね。 |
さらら: えっ、えぇ。。。(^ ^; たけち: ここでわかるようにPoemTypeを基準型としてMiscellaneousPoemTypeを派生させ、そのMiscellaneousPoemTypeというデータ型をもとに、miscellaneousPoemという要素を宣言したんだよね。今まで出してきた例と少し違うけれど、このXML Scehmaを元に次のようなXMLデータとXML Schemaとして書くことができるね。 |
※万葉歌(sample) |
※万葉歌(sample)のXML Schema |
さらら: そういえばこんな感じの例を見てきたのよね。 たけち: うん。そこで考えて欲しいことがあるんだ。このXML Schemaでは次のように左のデータ型から右の要素を宣言しているよね。
たけち: でも、
という宣言はここではしてなかったよね。 |
さらら: あっ、そうね。ここでは、PoemTypeはMiscellaneousPoemType、ElegyType、LovePoemTypeの3つの派生型の基準型になっただけで、これ自身は要素の宣言には使われていないわね。 たけち: そう。ここで見てもらいたいのは、LovePoemTypeはMetaphoricalPoemTypeの基準型だけれど、lovePoemという要素の宣言に使われてるよね。それに対してPoemTypeという基準型は要素の宣言には使われない、ということなんだ。つまりここでわかるのは、 ※要素の宣言には使われず、他の派生型の基準型としてだけ存在する意味があるデータ型が存在する ということなんだよ。 |
■abstract属性
さらら: 何かもったいぶった言い方だけれど、そういうデータ型があってもおかしくないわよね。 たけち: そこで、ここで紹介したいのは、xsd:complexType要素に加えることができるabstractという属性だよ。「抽象的な」という意味かな。 さらら: abstract..... たけち: xsd:complexType要素にとってはoptionalな属性で、省略された場合はabstract="false"という意味になるんだ。つまり僕達はxsd:complexType要素を使っていて、そこで知らず知らずに abstract="false" という属性の設定をしていたのだけれど、これを次のように明示的にabsract="true"という書き方にするね。 |
※xsd:complexTypeのabstract属性 |
さらら: こういう属性を加えると何ができるの? (^ ^) たけち: いや、何ができるんじゃなくて、できなくなる方なんだけど、こうするとPoemTypeというデータ型で要素を宣言しても、その要素は実際のXMLデータ(インスタンス)の中で使えなくなるんだ。 さらら: はぁ? たけち: つまり、abstract属性を指定していない |
※xsd:complexTypeのabstract属性指定無し |
のままだと、
といったように要素を宣言して、そのXML Schemaに合致した次のようなXMLデータを作ることができるよね。 |
※万葉歌(sample) |
■抽象要素
-- 実際のXMLデータでは使えない要素 --
さらら: えぇ・・・・・ たけち: しかし、abstract="true"というふうに、この属性でtrueを指定すると、それができなくなるんだよ。 さらら: へぇ〜。でも、そんなことをして、というか、できなくなって何か良いことあるの? たけち: このPoemTypeを間違って要素に使ったりするようなミスをすることがなくなり、またこのデータ型が、派生させることによって使えるデータ型だということがはっきりわかるよね。 さらら: ふ〜ん、そんなものなの。 たけち: 今はぴんと来ないかもしれないけれど、こういう書き方ができるというのは、オブジェクト指向でモデリングする際に、それなりに役に立つ機能だから覚えておこうね。 さらら: う〜ん、やっぱり何かぴんと来ないわね。。 |
たけち: ちなみにこのabstract属性は、xsd:complexType要素には存在するけれど、xsd:simpleType要素には存在しないんだ。だから複合型を抽象的なデータ型にはできるけれど、単純型を抽象的なデータ型にはできないから、その点は気をつけてね。 さらら: 複合型ではできて、単純型にはできないなんて・・・・・ますます存在意義がわからないわ。 たけち: まあ、これは実際にオブジェクト指向的にスキーマを作っていくようになると、それなりに意義がわかってくるようになるよ(^^;)
という書き方で、抽象要素poemの宣言になるんだよ。 |
さらら: 抽象要素って何?? たけち: それ自体では、実際のXMLデータ(インスタンス)側の方では使えない要素のことだよ。 さらら: はぁっ!? (?_?) |
たけち: つまり
という抽象要素poemを宣言すると、実際のXMLデータ側の方では、
というふうに使ってはいけないということなんだ。 |
さらら: 使ってはいけない要素を宣言するの!? たけち: そう。 さらら: 使ってはいけない要素を宣言して、いったい何になるの!? わっけわかんな〜〜〜い!! (ーー; たけち: ごめん、ごめん。確かにこの説明だけだとわけがわからないよね(^^;) この抽象要素は次回に説明する「代替要素」のようなテクニックと組み合わせて、使い道があるようなテクニックなんだ。ひとまずこういうものがあるということだけ覚えておこうね(^^;) 次回に期待してね。 さらら: は〜い。。。(も少し聞けば分かるかしら... (^ ^; ) 次は、代替要素です 。。。。 (^ ^* |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |