2003年1月12日(日)更新 |
■むやみに新しいスキーマを作らない
さらら: だいぶいろいろなXML Schemaの技術を学んできたけれど、実際にスキーマを作ろうと思ったら、結構、難しそうね。 たけち: そうだね。今まで学んできたもの、そしてこれからもしばらく学ばないといけないものは「こうしたい時にはどうしたらいいか」というXML Schemaのテクニックなんだよね。 さらら: う〜ん、大変そう。 たけち: でもねぇ。。 さらら: えっ? たけち: そうだね。ここでスキーマを作る際の究極の奥義を、さららに教えとこうかな (^ ^) |
さらら: え、なになに、スキーマを作る際の究極の奥義ってどんなの? たけち: これはとても大事なことだからよく聞いてね。スキーマを作る際の究極の奥義とは... さらら: えぇ、それは。。。 たけち: スキーマを作らないということ。 さらら: えっ? .....ねぇ、たけちって私のことを馬鹿にしてない?(- -;) |
たけち: あ、ごめん。別にそんな意味じゃないんだよ。確かにこの言葉には、逆説的なことを言って人を驚かせているようなところがあるけれど、ちゃんと真面目な意味がこめられているんだよ。例えば さらら: まあそう言われればそうだけど・・・・・ たけち: スキーマを作る際の究極の奥義とは、スキーマを作らないことであるというは、下手な、自分だけが満足しているスキーマを濫造するのではなくて、先人の作った考え抜かれた上手なスキーマをなるべく再利用し、どうしても必要な部分だけ、自分でスキーマを作りなさい、といった意味なんだ。 |
■いろいろなスキーマを作ってみましょう
さらら: あぁ。。。。なんとなくわかるわ。 たけち: 次のXMLデータを見てみようね。 |
※XMLデータ例: 万葉歌と解説-1 |
さらら: 家持さんの歌ね。 たけち: 一見、まったく問題がないように見えるXMLデータだけれど、これには問題点があるんだよ。 さらら: えっ?、全然問題がないように見えるわ。 たけち: そうだね。じゃあ、まずはDTDを書いてみようね(^ ^) さらら: あっ。う〜ん。。。こうかしら。(^ ^; |
※DTD例: 万葉歌と解説-1
|
たけち: そうだね、こういう書き方で一応通るよね。それじゃあ今度は次のXMLデータのDTDも考えてみようね。 |
※XMLデータ例: 万葉歌と解説-2 |
さらら: え〜と、これのDTDなら同じようなパターンを何度もしてきたから、だいたいわかるわ。え〜っと...... |
※DTD例: 万葉歌と解説-2
|
たけち: そうだね (^ ^*) じゃあ、たて続けに第3弾行くよ。次のDTDはちょっと難しいかな(^ ^;) さらら: えっ。まだやるの?! |
※XMLデータ例: 万葉歌と解説-3 |
さらら: きゃ〜、何、このHTMLもどきは(^ ^;) こんなのとてもできないわ(^ ^;)...... たけち: これは、例えば次のような書き方のDTDに合うかなぁ。本物のXHTMLのDTDとは程遠いけどね。(^ ^;) |
※DTD例: 万葉歌と解説-3
|
さらら: あ〜ん。。やっぱりややこしそう。(^ ^;) たけち: 本物のXHTMLのDTD(http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd(注1))はもっと凄いよ。。。(^ ^;) でも、綺麗にまとめられていて、とても勉強になるから是非見てみようね。 さらら: えっ、えぇ。。。(^ ^; たけち: .さて、3つの異なるXMLデータとそのDTDを見てもらったんだけれど、この3つに共通するものってわかるかい? さらら: え〜と。。。。。次の部分だわね。 |
※上記3つのXMLデータの共通部分
|
たけち: そうだね。 さらら: DTDだと次の部分なのよね。そうでしょ。 |
※上記3つのDTDの共通部分
|
■無駄にスキーマを量産しないようにしましょう
たけち: そうだね。1番目の例は歌をあげてその解説をしている、いわゆる「解説」型のドキュメントだね。そして2番目は歌を並べている「歌集」型のドキュメントだね。そして最後の3番目は会話の中に歌が出てくる「会話」型のドキュメントになっているんだね。 さらら: そうね。無駄と言えば無駄よね。似たようなものや同じものを3回も書くというのは、ね。 たけち: さらにh1要素やp要素やem要素の定義を考えると、1番目に出てきたDTDの |
<!ELEMENT h1 (#PCDATA)> |
たけち: という部分は、3番目に出てきたDTDの、 |
<!ENTITY % Inline "(#PCDATA | font | strong | em)*"> |
たけち: と実は同じなんだよね。3番目の方がより詳しい定義のしかたをしているので、一見別物に見えるけれど、この3番目のh1要素やp要素やem要素の定義の仕方で、1番目のXMLデータのh1要素やp要素やem要素を検証することも可能だよね。結局1番目も3番目も、少し違う形でXHTMLの真似をしているだけなんだね。 さらら: そう言われればそうだわね。 たけち: ここでは、3つの例を出したけれど、これからさらに歌にまつわる別のドキュメント構造が必要になればなるほど、一部が同じで一部が違うというDTDがどんどん増えていくことになるね。 さらら: それは、そうだわ。とっても無駄なことをしているわね。 |
たけち: そう考えると、ほとんどその共通部分からできているたとえば2番目のDTDについては、これを共通部分を持っているDTDから参照したくなるよね。それからXHTML系要素について書いた部分についても、こんな偽物のXHTMLのDTDを何回も書くくらいだったら、本物のW3Cが定めたXHTMLのDTDを参照したいよね。 さらら: えぇ、それはそうだわね。でも、そんなことができるの? (^ ^;) |
■XHTMLのDTDを参照する
たけち: それが可能なんだよ。まずは実例を見てもらった方が早いよね。これをするにはまずXHTML系のDTDは、インターネット対応のDTDのパーサーがあればいいんだけれど、あまりそういうのがなさそうだから、 さらら: えぇ。 たけち: そうすると、1番目の例のDTDは次のように書くことができるんだよ。 |
※DTD例: 万葉歌と解説-1 他のDTDを参照 ※manyouPoem.dtd |
たけち: それから、3番目の例のDTDは、こう書くことができるんだよ。 |
※DTD例: 万葉歌と解説-3 他のDTDを参照 |
たけち: さっきのDTDと比較してみるとわかるけれど、DTDが随分短くなったよね。(^ ^) こういうふうに、共通となる他のDTDを参照することによって、新たに書かなくても良くなったんだね。 さらら: そうね。本当に短くなっているわ。(^ ^) たけち: ちなみにここに出てくる「%block;」というのは、xhtml1-transitional.dtd の中に出てくるけれど、 |
<!ENTITY % block |
というもので、p要素だけでなくて、h1のようなheading系の要素、div要素、table要素等を含むものなんだ。だから、 |
<!ELEMENT document (%block; | poem)*> |
というのは、 |
<!ELEMENT document |
という意味になって、p要素やh1要素だけでなく、それ以外のこれらのXHTML系要素も使えるようになるんだね。 さらら: よくわからないけど、凄〜い! あんなに長かったDTDがこんなに短くまとまった上に、さらに複雑なことができるDTDになっているのね! これだと完璧ね!(^ ^) たけち: そう、確かに凄く綺麗に簡潔になったよね。まあもっとも、実は完璧じゃなくて、大きな問題点もあるんだけどね...(^ ^;) さらら: あらま (^ ^;) たけち: 確かに素晴らしいテクニックなんだけれど、このテクニックをDTDで利用する際の問題点は、 |
さらら: う〜ん、それは困るわ。 たけち: この問題を解決するためには、要するに、皆それぞれが作るスキーマの要素名が、全部違っていればいいんだよね。つまりそれぞれの人が作る要素の名前の衝突が起きなければうまくいくんだ。 さらら: え、そんなことができるの? たけち: うん、それじゃあ次回は本格的に「名前空間」について話すことにするね。 さらら: あっ、は〜い!! 次回は名前空間とスキーマ(2)です。...... (^ ^)v |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |