2003年1月5日(日)更新 |
■要素の子要素に自分自身が出てくる例
たけち: 今回は、新しい文法というわけじゃなくて、今まで勉強した文法を使って、ちょっと変わったテクニックを勉強することにするね。 さらら: ちょっと変わったテクニック? たけち: うん。まあ、プログラミングの分野ではそれほど変わったテクニックでもないんだけれど... まずは以下のDTDと、それに相当するXML Schemaを見てみようか。 |
※DTD: 再帰的定義の例-1
|
※XML Schema: 再帰的定義の例-1
<?xml version="1.0" encoding="Shift_JIS" ?> |
たけち: DTDにするとわずか2行だから、どういうスキーマかわかるよね。 さらら: えっ、recursion要素の定義の中にrecursion要素自身が出てくるの? たけち: そうなんだよ。こういうスキーマは例えば、
とか、
に適合するよね。 |
■再帰的定義
さらら: う〜ん、わかるような、わかんないような。。。 たけち: 不思議に見えるかもしれないけれど、これはこれでちゃんとした定義なんだよ。 さらら: ふ〜ん。 たけち: こういう、自分の中に自分が出てくるような定義のことを、再帰的定義と呼ぶんだ。再帰というのは不思議に思えるかもしれないけれど、実はコンピュータの世界でも、そして実際の世界でも、あたりまえに存在しているんだよ。 さらら: へぇ〜。でも、こんなスキーマって役に立つのかしら? たけち: あっ、これはもっとも単純な例だからね (^ ^;) 今度は実際に役立ちそうなスキーマの例を出してみようね。 |
※DTD: 再帰的定義の例-2
|
たけち: こういうDTDには、次のようなXMLデータが考えられるよね。 |
※XMLデータ: 再帰的定義の例-2に合致するインスタンス |
さらら: あぁ、そっかぁ。章とか節とか、要するに文章の塊をいくらでも細分化できるスキーマなのね。 たけち: そう、最初から「章の一つ下の階層は節で...」みたいに決めたスキーマを作ってもいいけれど、こういう再帰的なスキーマだと、いくらでも下の階層を細分化できる、という柔軟性があるよね。じゃあ、これのXML Schemaを書いてみようか。 さらら: え、えっと。。。。。こうかしら (^ ^; |
※XML Schema: 再帰的定義-2 |
■XHTMLを簡素化した例をみてみましょう
さらら: ところで、こんな構造って、XHTMLにもあったんじゃないかしら。 たけち: そうだね。XHTMLなんかは再帰をよく使っている例だよね。実際にどんなふうになっているかを見てみようかな... さらら: えっ (^ ^; たけち: ...と思ったけれど、本物のXHTMLのDTDを示して解説したりすると大変だから、それをもうちょっと簡素化した例を見てもらおうね (^ ^;) 例えば、こんな感じかな。。。 |
※DTD: XHTMLを簡素化したもの
|
たけち: 本物のXHTMLはもっと複雑だけれど、それを簡素化したものだよ。ここで見て欲しいのは、%Inline;というパラメータエンティティなんだ。これはp, font, strong, em要素などの内容モデルになるものだけれど、このパラメータエンティティ自身はfont, strong, em要素とテキストを含む混在内容からなるんだ。こういう再帰的定義がしてあるから、次のように、何重もネストしたXMLデータが定義できるんだね。 |
<?xml version="1.0" encoding="Shift_JIS" ?> |
たけち: 再帰的定義というと、ちょっと特殊に見えるかもしれないけれど、実はこんなXHTMLのようなマークアップにはよく出てくるものなんだよ。 さらら: う〜ん、やっぱりややこしそうだけど、なんとなくわかるわ。 たけち: じゃあ、今のDTDをXML Schemaにしてみようね。 さらら: えっ、(^ ^;) |
※XML Schema: XHTMLを簡素化した例
|
さらら: DTDと比べるとなんとなくわかるような...(^^;) でも、これでXHTMLのようなスキーマを書く際にはどうしたらいいかわかったわ (^ ^) たけち: そうだね。もっとも「XHTMLのようなスキーマ」を、本当は作ってはいけないんだけれどね。 さらら: えっ? たけち: あ、それじゃあ次回は「名前空間」について話すことにするね。 さらら: あっ、はい!! 次回は名前空間とスキーマ(1)です。...... (^ ^)v |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |