2003年2月16日(日)更新 |
■要素の定義を新しいスキーマファイルで変更できる
たけち: 前回は、同じ名前空間のスキーマを参照できるincludeについて説明したよね。 さらら: そうね。 たけち: 同じ名前空間のスキーマを参照できるのなら、ついでに場合によってはその定義を一部変更するようなことができると便利だよね。 さらら: あ、それは便利そうね(^^) 要素の定義を新しいスキーマファイルで変更できる、というわけなのね。 たけち: だいたいそんなところだね。以下の4つを新しいスキーマファイルで変更するredefineというテクニックがあるんだ。ただ、厳密に言うと「要素宣言」や「属性宣言」そのものは変更できないんだけどね。 |
![]() |
【redefineで変更できるもの】
|
さらら: ふ〜ん、そうなのね。でも、これだけじゃ、なんのことかよくわかんないわ。 たけち: まずは実際に見てもらった方が早いよね。まず、次のXMLデータをみてみよう。 |
※XMLデータ例: 万葉歌人 |
たけち: このXMLデータのXML Schemaとして、次のものを考えたとしよう。 |
※XML Schema例: 万葉歌人 【poets1.xsd】 |
さらら: あ、これって覚えがあるわ。単純型のリストの説明で出てきた例題よね。そのときは、これをさらにリストの数、つまり詩人の人数が4人になるように変更したのよね。 たけち: そうだったよね。今回も同じようにリストの数、つまり歌人の人数が4人になるように変更してみるけれど、今回はあの時と違って、データ型の名前を変えずにこれを変更してみるね。 さらら: データ型の名前を変えずに変更する? たけち: そう、実際には次のようにするんだよ。 |
※W3C XML Schema: 万葉歌人(歌人数を4人に制限) |
■redefine要素の中では、基準型と派生型のデータ型の名前が同じ
さらら: あれぇ!?、基準型と派生型のデータ型の名前が同じなの!? 自分自身を基準型にして、派生しているわけなの!? たけち: そう、普通はこんなことをしたらエラーになるけれど、xsd:redefine要素の中だけは、逆にこれをしないとエラーになるんだ。 さらら: そうなの〜。 たけち: includeでは、同じ名前空間の要素やデータ型、名前付きモデルグループ、名前付き属性グループなどを参照したよね。けれども、あくまで参照するだけであって、その定義まで変更してしまうことはなかったよね。 さらら: そうなんだぁ。 たけち: この例での、そうした関係を見ておこうね。 |
![]() |
■complexTypeをredefineする例
たけち: 今のはsimpleTypeをredefineした例だったけど、complexTypeをredefineする例も見てみようね。 さらら: えぇ。 たけち: まずXMLデータとそれに対応するXML Schemaを見て。 |
※XMLデータ例: 万葉歌 |
※XML Schema例: 万葉歌 【manyouPoem1.xsd】 |
さらら: えぇ。わかるわ。 たけち: このXMLデータの内容にkana要素(万葉仮名の文字列を内容として持つ)を追加したような、次のようなXMLデータを考えるよ。 |
※XMLデータ例: 万葉歌-2: kana要素を追加 |
さらら: うんうん。 たけち: これに対応するXML Schemaはredefineを使って次のように書くことができるんだよ。 |
※XML Schema例: 万葉歌-2: kana要素を追加 |
■名前付き属性グループ(attributeGroup)をredefineする例
さらら: これも同じ名前の基準型を使って、派生させているのね。 たけち: そうだね。じゃあ、名前付き属性グループ(attributeGroup)の場合も見てみようね。 |
※XMLデータ例: 万葉歌-3 |
※XML Schema例: 万葉歌-3: 【manyouPoem2.xsd】 |
さらら: あら、pno属性を定めた部分が名前付き属性グループとして独立しているわ。こんなことをしたら、逆に面倒くさい感じなのに。 たけち: 今まで名前付き属性グループを、綺麗にまとめて記述する手段としてだけ学んできたから、ちょっと変に見えるかもしれないね。でもこれが名前付き属性グループをredefineするために必要な下ごしらえなんだよ。さて、さっきのXMLデータを次のように拡張することを考えるね。 |
![]() |
※XMLデータ例: 万葉歌-4 |
たけち: こんなふうにmp:poem要素にsendTo属性とemotion属性を追加することにするね。 さらら: これってさっきのcomplexTypeのredefineを使えばできるのじゃないかしら。 |
※XML Schema例: 万葉歌-4: sendTo属性、emotion属性を追加 |
たけち: さすが、今日はさららは冴えているね。 さらら: これくらいなら、わかるわ(^ ^*) たけち: でも、今回したかったのはこういう解じゃないんだ。間違いじゃないけれどね(^ ^;) さらら: あれま・・・(^ ^;) たけち: この場合は、次のように書けるんだよ。 |
※XML Schema例: 万葉歌-4: sendTo属性、emotion属性を追加(attributeGroup) |
さらら: なるほど、こうなるわけね。敢えて名前付き属性グループを使った意味があるわけね。 たけち: そうだね。今まで、名前付き属性グループは、綺麗にまとめて記述する手段としてだけ学んできたけれど、こんなふうに、将来改造されて再利用されることを想定して使われる場合もあるんだね。そして、名前付きモデルグループの場合も同様だよ。 |
![]() |
■名前付きモデルグループをredefineする例
※XMLデータ例: 万葉歌-5 |
※XML Schema例: 万葉歌-5: 【manyouPoem5.xsd】 |
たけち: これのyomi要素の前に作者をあらわすpoet要素を追加しようとすると、次のように書けばいいんだよ。 |
※XML Schema例: 万葉歌-5: 【manyouPoem5.xsd】をredefineし、poet要素を追加 |
さらら: あ、なるほど。派生の「拡張」では、前に追加なんてできなかったけれど、名前付きモデルグループでは可能なのね。以前「名前付きモデルグループのネスト」を勉強した際にはそれほど便利な機能だと思わなかったけれど、こうしてみると結構便利な機能だわ。 たけち: そうだね。ただし、ここで気をつけておかないといけないことは、最初から、名前付きモデルグループや名前付き属性グループを作っておかないと、こういうテクニックは使えない、ということなんだ。そういう意味では再利用を考えたら、きちんと前もって名前付きモデルグループや名前付き属性グループを使った方がいいね。 さらら: なるほど。 たけち: redefineについては、これでおしまい。次回は、「グローバル属性とグローバル属性宣言」について勉強しようね。 さらら: あっ、は〜い!! 次回は、グローバル属性とグローバル属性宣言 その1です。...... (^ ^)v |
![]() |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |