2002年10月20日(日)更新 |
■要素を「モデルグループ単位」で追加
たけち: ここで注意したいのは、まず要素を追加できるのは「モデルグループ単位」であるということだよ。例えば、 さらら: あ、こんなのは駄目なのね.....(^ ^; たけち: もう一つ注意したいのは、追加した結果はあくまで、次のようになることだよ。 |
たけち: たとえば、次の例をみてみよう。 |
<?xml version="1.0" encoding="Shift_JIS" ?> |
たけち: 前回の例題との違いはsequenceだったモデルグループが2つともchoiceに変更されていることなんだ。 さらら: あっ、そうなのね。 たけち: この例では、基準型は、PrePoemTypeで さらら: えぇ。 たけち: これに派生型(PoemType)の方で さらら: え、そうじゃないの? |
たけち: ...(^ ^;) そうじゃなくてぇ、あくまで作られるのは、 |
たけち: なんだから、この場合は、 さらら: あ、そうかぁ(^^;) でも、何か直感的じゃないわ。それに、これじゃあ、choiceの内容を増やすことができないのよねぇ... たけち: そうだとも言えるね。ただ、この方法ではchoiceの内容を増やすことができないけれど、オブジェクト指向的にchoiceの内容を増やしたい場合というのは、後で説明する「代替要素」を使うようなケースが少なくないから、実際はそれを使って何とかなる場合もあるよ。これについてはまた後で説明するね。 さらら: ふ〜ん。。。。 |
■allモデルグループで注意すること
たけち: それから、あと一つ注意しないといけないのは、基準型の内容モデルや、追加したいモデルグループに、allモデルグループは使えない、ということなんだ。 さらら: え、何故なの? たけち: 以前allについて勉強したとき、 さらら: あら、結局そうなってしまうのね。allって不便だわね。 |
たけち: 結局、sequence単位での追加になるということは、内容がsequenceばかりのものを後から追加する、という使い方が一番無難に使えるということになるね。 さらら: ふ〜ん、そうなんだ。あら、そう言えば、基準型の後じゃなくて、前に追加するとか、途中に追加するためにはどうしたらいいの? たけち: うん、それはできない。 さらら: できない!? たけち: そう、できないんだ。。。(^ ^;) 基準型の前に追加するとか、途中に追加するなんてできないんだよね。 さらら: それってとても不便じゃない? たけち: ちょっと不便かな(^ ^; さらら: だいぶ不便だと思うわ。何か今回の話を聞いていたら、「モデルグループの追加」って、すごく使用する際の制約が多い気がするわ。 |
たけち: 確かにこのあたりがXML Schemaに対する批判の一つとしてあげられる点だよね。結局「要素の並び」ということをXMLが重視しているのに対し、従来のオブジェクト指向プログラミング言語などは「継承で追加されるデータは順不同の関係」としてしか扱ってこなかった、ということのギャップがここに出ているとも言えるよね。元々順不同の関係である属性については、属性を追加する際にはこのような問題は生じなかった。しかし、データの並び方が問題となる要素では大きな問題になってくるし、XML Schemaを策定するのには、こういったことへの批判からすごく年月を費やしたけれど、結局バランスのとれたこれ以上のうまい解を見つけることができなかったとも言えるね。 さらら: ふ〜ん。 たけち: まあどうしても順不同を使いたいときには、XML Schemaの場合、属性で扱った方がいいかもしれないね。もちろん属性として扱えない複合型データはどうしようもないんだけれども。 さらら: なるほどね。 たけち: それから最後に、前回「名前付きモデルグループ」で解いた、あの要素がたくさんある問題をモデルグループの追加を使って解こうね。UMLのクラス図も載せておくね。 さらら: えっ、えぇ。。。(^ ^; たけち: 一部にまだ教えていないSubstitution Group(代替グループ)というテクニックを使っているけれど、それはひとまず無視してね(^^;) |
※モデルグループの追加を使った万葉歌のXML Schema |
たけち: 次回は、「複合型内容をもった複合型」の「制限(restriction)」を勉強してみることにするね。 さらら: はい。 次は複合型内容をもった複合型の制限(1)です 。。。。 (^ ^* |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |