2002年12月29日(日)更新 |
■複数のID値を参照したい
たけち: IDREFS型に相当する参照ってことなんだけど、実は直接的にはIDREFS型に相当する書き方は存在しないんだよ。 さらら: え、ないの? それじゃあ困るじゃない。複数のID値を参照したい場合、どうすればいいの? たけち: いや、別のやり方で複数のID値を参照できるんだよ。例えば、 |
<anthologists people="p01 p02" /> |
だった部分を、 |
<anthologists> |
というふうに書き換えるんだ。実際こういう書き方の方が、XSLTやDOMなどで処理しやすくて、自然だよね。 |
さらら: ふ〜ん。ひとつひとつのIDを参照するのね。 たけち: 全部書いて見ると次のようなXMLデータになるよね。 |
※XMLデータ: 歌集(Anthology) ....... 複数のID値を参照
|
さらら: えぇ。 たけち: このXMLデータに相当するXML Schemaは次のように書けばいいよね。 |
※XML Schema: 歌集(Anthology) ....... 複数のID値を参照
<?xml version="1.0" encoding="Shift_JIS" ?> |
■要素の内容でIDを参照する
さらら: なるほど。こういう風にできるのね。 たけち: じゃ、今度は、idの部分やpoetの部分を属性ではなくて要素に変更してみようね。ID型, IDREF型, IDREFS型で問題のひとつだと取り上げた、ID型、IDREF型では解決できなかった例の1番目だよ。 さらら: えっ? あっ。 たけち: 次のような問題だったよね。 |
※ID型、IDREF型、IDREFS型によるIDの管理方法の欠点 1.IDとなるもの、そしてIDを参照するものは属性でなければならない。要素の内容をIDにしたり、要素の内容でIDを参照するような場合の検証は不可能である。 2.〜5.は省略 |
さらら: あっ、そうだったわね。(^ ^; たけち: つぎに、そのような例を載せるね。 |
※XMLデータ: 歌集(Anthology) ....... IDとその参照が要素の内容 |
たけち: これに対応するXML Schemaは次のようになるね。 |
※XML Schema: 歌集(Anthology) ....... IDとその参照が要素の内容 |
さらら: あぁ、これならわかりそう。 たけち: id要素はpersonの子要素に、そしてpoet要素はpoem要素の子要素になるから、
というふうにフィールドのXPathの値が変わるんだね。 さらら: これなら私でもわかるわぁ〜 (^ ^*) |
![]() |
■2つのkeyを設定する
たけち: それから今度はkeyが2つある例を出してみるね。前回問題になったID型、IDREF型では解決できなかった2番目の例だよ。 さらら: はっ、はい。(^ ^; たけち: 次のような問題だったよね。 |
※ID型、IDREF型、IDREFS型によるIDの管理方法の欠点 1.は省略 2.複数の要素型の中の属性をIDとして設定した場合、それぞれを別々に独立した一意性を持った対象としての検証は不可能であり、XMLデータ全体が一意性の検証対象となる。 3.〜5.は省略 |
さらら: あっ、こんなのあったわね。 たけち: じゃ、2つのkeyを設定したXMLデータの例をみてみようね。 |
※XMLデータ: 歌集(Anthology) ....... 2つのkeyを設定
|
たけち: これに対応するXML Schemaは次のようになるね。 |
※XML Schema: 歌集(Anthology) ....... 2つのkeyを設定 |
たけち: ここで見て欲しいのは次のところだよ。 |
<xsd:key name="person-id"> |
たけち: というふうに、2つのkeyが設定されているけれど、名前が違っているから混乱しないよね。 さらら: これもわかる気がするわ。こういうのをいくつ作ってもいいわけね。 たけち: うん、そうだね。 |
■複数のフィールドを設定
たけち: さて、つぎは、「※ID型、IDREF型、IDREFS型によるIDの管理方法の欠点-(3)」として載せた例を見てみようね。歌集(anthology)と歌番号(pno)との組み合わせで一意性を確保する例だよ。 |
※XMLデータ: 和歌 ....... 歌集(anthology)と歌番号(pno)の組合わせ
|
![]() |
たけち: pno属性だけでは一意性が保たれない。だけど、anthology属性と併せると一意性が保たれる、という例だね。 さらら: え〜っ、これのXML Schemaはちょっと想像がつかないわ。 たけち: あっ、実は答は簡単なんだけれどね(^ ^;) 次のXML Schemaをみて。 |
※XML Schema: 和歌 ....... 歌集(anthology)と歌番号(pno)の組合わせ
|
たけち: ここで見て欲しいのは、
だった部分を、
の部分で、一つのセレクタに対してフィールドが2つあるんだよね。そしてこの2つのフィールドの組み合わせで一意性が保証されるようになるんだ。 さらら: あ、フィールドをいくつも設定して良かったのね(^^;) たけち: そうなんだ。こうすると複数のフィールドの組み合わせが、IDのようになるということも知っておいてね。 さらら: はい。 |
![]() |
■IDが通用する範囲を限定
たけち: さて、つぎは、「※ID型、IDREF型、IDREFS型によるIDの管理方法の欠点-(4)」として載せた例を見てみようね。IDが通用する範囲を限定する例だよ。 |
※XMLデータ: 和歌 ....... pnoの有効範囲
|
たけち: XML Schemaは次のように書くんだよ。 |
※XML Schema: 和歌 ....... anthologyの中で使われるkey
|
さらら: あ、anthology要素の中でkeyを設定しているのね。 たけち: こういう書き方をすると、このkeyの有効範囲は一つのanthology要素の中だけなんだね。だから複数のanthology要素が存在しても、その内部での一意性が保たれていることを検証できるんだ。これでID型、IDREF型を使ったのではできないようなことが、keyやkeyrefを使うとできることがわかったよね。 さらら: えぇ、分かった気がするわ。(^ ^* たけち: あ、それから一つ注意だけど、xsd:key要素やxsd:keyref要素は、要素宣言の子要素として出現するんだけれど、要素宣言が匿名の型定義を使う場合はちょっと注意が必要だよ。 |
![]() |
※XML Schema: 和歌 ....... anthology(匿名の型定義)の中で使われるkey
|
![]() |
たけち: この例でわかるように、xsd:key要素やxsd:keyref要素の親要素となる要素宣言が、匿名の型定義を含む場合は、その匿名の型定義となるxsd:simpleType要素またはxsd:complexType要素は、xsd:key要素やxsd:keyref要素の前に存在しないといけないんだ。 さらら: へ〜、そんな決まりがあるのね。 たけち: これでkeyについての説明を終わるね。 さらら: は〜い。あ〜、今回は疲れちゃった(^ ^;) たけち: でも、この際だからkeyに似た機能であるuniqueについても一緒に説明しておくね。 さらら: えっ、まだあるの(^ ^;) |
■unique
たけち: あ、そんなに長くは話さないから(^^;) 次のXMLデータをみてごらん。 |
※XMLデータ: 歌人 ....... idのあるpersonとidの無いperson
|
さらら: えっ、これってどういうこと? たけち: この場合、一部のデータにはid値が存在しないよね。でも、id値が設定されているところでは一意性は保たれている、という場合だよ。 さらら: あっ、そうなんだぁ。 たけち: こういうXMLデータではこれまでの例のようなkeyを使った方法だと、これはエラーになってしまうんだ。でも、id値が設定されているところでは、一意性は保たれているのだから、せめてその部分だけでもチェックしたい、というケースなんだ。 さらら: でも、こういう場合にはkeyはエラーを返すだけなんでしょ。 たけち: そうだね、でもID型を使うと、次のようなDTDやXML Schemaで、これもチェックできるんだよ。 |
![]() |
※DTD
|
※XML Schema
|
たけち: このDTDやXML Schemaが今まで見たようなDTDやXML Schemaとちょっと違うのは、 さらら: そうなの。。。あら、ID型だとできるのに、keyでできないなんて困るわ。 たけち: そこでこういう場合はkeyではなくて、keyとよく似たuniqueという仕組みを使うんだ。 さらら: unique? |
![]() |
※XML Schema: uniqueを使用
|
![]() |
たけち: ここで見て欲しいのが、 |
<xsd:element name="people" type="PeopleType"> <xsd:unique name="person-id"> <xsd:selector xpath="person" /> <xsd:field xpath="@id" /> </xsd:unique> </xsd:element> |
の部分なんだ。見てもらったらわかるように、今まで「key」と書いてあった部分が、そのまま「unique」に置き換わっただけだよね。つまりこのuniqueの文法はkeyと変わらないんだ。 さらら: そうなんだ。。。 たけち: IDの管理の仕方についてはこれでおしまい。次回は「再帰的定義」の話をするね。 さらら: は〜い!! |
次回は再帰的定義です...... (^ ^)v |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |