2002年12月22日(日)更新 |
■ID型・IDREF型 → key・keyref
たけち: まずは実際に実例を見てみようね。ID型・IDREF型のときの復習だけれど、こんな例をやったね |
※※XMLデータ例: 歌集(Anthology)
<?xml version="1.0" encoding="Shift_JIS" ?> |
さらら: あっ、そのときの例だったわね。 たけち: でもこのXMLデータに相当する、ID型やIDREF型を使ってXML Schemaはどうだったかな? さらら: え、......えっと、こうだったわよね(^^; |
![]() |
※XML Schema: 歌集(Anthology)
<?xml version="1.0" encoding="Shift_JIS" ?> |
たけち: そうだね。これをまずはID型とIDREF型をやめて、keyとkeyrefを使った書き方に改めてみようね。ID型やIDREF型であった部分は、NCName型としておくね。 |
※XML Schema: 歌集(Anthology) ・・・・・keyとkeyrefを使用
<?xml version="1.0" encoding="Shift_JIS" ?> |
■key: id属性を宣言する
たけち: ここで見て欲しいのは
|
たけち: の部分なんだ。ここでid属性の値の一意性を保証したり、poet属性の値がid属性の値の参照であることを設定している部分なんだよ。 さらら: きゃ〜、全然わかんない (^ ^;) たけち: いや、ゆっくり見ていけばわかるよ。まず
というのは、これからperson-idという名前の、一意性を保証するための設定をしますという意味になるんだね。 |
たけち: 次に、
に出てくるselector(セレクタ)というのは、一意な値、つまりIDを持つべき要素を設定する部分なんだ。ここではselector(セレクタ)はpeople要素の子要素のperson要素になるよね。そして、このxsd:selector要素のxpath属性というのは文字通りXPathの意味なんだよ。XPathについては、以前XSLTの説明をした際に勉強したよね。 さらら: そういえば、そういうものがあったわね (^ ^;) たけち: この場合、anthology要素の要素宣言の中でkeyの設定をしているんだけれど、anthology要素から見て、IDを持つべき要素であるセレクタ:person要素のXPathはpeople/personになるよね。だから、こんな書き方をしているんだ。 さらら: ふ〜ん。。。 |
たけち: そして、
なんだけれど、このフィールドというのは、実際にどういう要素や属性が一意な値、つまりIDになるか、ということを設定している部分なんだ。ここではperson要素のid属性が一意な値、つまりIDになるよね。これがフィールドなんだ。 さらら: うっ、うん。。。。。 (^ ^;) たけち: ところでこのxpath属性の部分なんだけれど、さっきは さらら: う〜ん、ややこしいのねぇ (^ ^;) たけち: ID型と比べると、ぐっとややこしくなった感じがするよね。でも、じっくり考えれば、至極あたりまえのことを設定しているだけだから、よく眺めて理解してね (^ ^) さらら: うん。。。 |
![]() |
たけち: じっ、じゃあ、この例でのkeyとkeyrefによる参照の関係を図にしておくね。 (^ ^; |
■keyref: id属性の値を参照する
たけち: さて、次にそのid属性の値を参照するkeyrefの方を解説しようね。
たけち: これはperson-idという名前のkeyを、参照するための設定をします。その参照の名前をpoem-poetという名前にしますということを意味しているんだ。先ほど、「person-id」という名前のkeyを作ったわけだけれど、その名前を使って参照するわけだね。 さらら: あっ、どうしてkeyにわざわざ名前をつけるのかと思ったら、こういうところで参照するためなのね。 たけち: そうだね。ID型の場合、例え複数の要素の属性をIDに設定しても、そのIDはXMLデータ全体を対象として、それ自体が唯一無二のものだったんだ。だからそれに名前をつけなくても、IDREF型でそのまま参照できたんだね。 さらら: なるほどね。 |
![]() |
たけち: じゃ、次にいくね。
たけち: というのは「参照したい値を持っているのはpoem要素ですよ」という意味だね。これがこのkeyrefのセレクタになるんだ。さっきと同じように、この場合のセレクタは、『anthology要素の要素宣言の中でkeyrefの設定をしているから、anthology要素から見て、IDの参照値を持つべき要素であるpoem要素のXPathは「poems/poem」になる』わけなんだ。 さらら: うっ、うん........ |
たけち: そして最後に、
たけち: なんだけれど、これは参照値そのものを入れるpoet属性のXPathを設定している部分だね。ここではpoet属性がkeyrefのフィールドになるんだ。keyのセレクタとフィールドの関係と同じように、keyrefでも「セレクタとなっているpoem要素から見た、poet属性のXPath」を書かないといけなから、この場合フィールドのxpathの値は「@poet」になるわけなんだ。 以上のことをまとめると、つぎのようになるね。 |
![]() |
さらら: だいたい、わかった気がするけれど。何か、ややこしいわね(^^;) ID型やIDREF型の方がはるかに簡単だわね。(^ ^;) たけち: まあ、確かにID型やIDREF型の方が簡単ということはあるよね(^^;) keyやkeyrefの場合、本格的な仕組みを導入して、ID型やIDREF型の欠点を解消する分、これだけややこしくなっているんだね。でも、さっきも言ったように、じっくり見ていればわかるから、何回も見て覚えてね(^^) さらら: ところで今回の例ではIDREFS型のところがないわね。IDREFS型に相当する参照はどう書けばいいの? たけち: あっ、そうだったね。じゃ、それについては次回お話しようね。 さらら: は〜い。 次回はkey, keyref, unique: その3です。...... (^ ^)v |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |