2003年6月1日(日)更新 |
■XMLデータ例とXML Schema例
たけち: 前回は「任意のどんな要素が出現してもよい」というxsd:anyについて学んだね。「任意のどんな要素が出現してもよい」ということができるのだったら、「任意のどんな属性が出現してもよい」ということができてもいいよね。 さらら: えぇ、そうね。 たけち: というわけで、今回は「任意のどんな属性が出現してもよい」というxsd:anyAttributeについて勉強しようね。まずは次のXMLデータとXML Schemaの例を見て。 |
※XMLデータ例: 【m_poem.xml】 |
※XML Schema例: 【manyoPoem.xsd】 |
※XML Schema例: 【print.xsd】 |
■グローバル属性の利用
さらら: これって以前、グローバル属性を勉強してきたときに出てきた例と同じだわよね。 たけち: そうだね。厳密に言うとXMLデータの中でxsi:schemaLocation属性を使っていることだけ違うけれど、中身は一緒だね。さて、ここでちょっと脱線するよ。このprint:color属性を使って、これを使っているどんなXMLデータでも、それなり表示させてしまうprint.xslというXSLTプログラムを示すね。 さらら: あら、XSLTなんて久しぶりね。(^ ^*/p> |
※XSLT例: 【print.xsl】 |
たけち: このXSLTを最初のXMLデータ【m_poem.xml】に適用すると、次のような表示(ここでは、IE 6.0の場合)がされるんだよ。一応、以上のファイルの関連も載せておくね。 |
さらら: へぇ〜。 たけち: 簡単なXSLTの割には、まあまあの表示ができているように思えないかい。 さらら: まあ、そう言われればそうね。 たけち: それで、このprint:colorについてのXML Schema【print.xsd】とXSLT【print.xsl】とを見て欲しいんだけれど、このXML SchemaもXSLTも、どのようなXMLデータに対しても適用できるように作られているんだよね。つまり、print:colorというグローバル属性が、いかなる名前空間のスキーマのXMLデータに対して使われても、とにかくこのグローバル属性を使うだけで、それなりに表示させることができるんだ。これって凄いことだと思わないかい? さらら: ふ〜ん。。 たけち: (さっ、さらら.....(^ ^;) ) 実は、グローバル属性を入れ込むだけで、これだけのことができてしまう、というのはとても便利なんだよ。というのは、元々意図したxmlns:mp="http://www.litera-ltd.jp/ns/manyouPoem"のようなXMLデータのツリー構造を改造しなくてもいいからね。 |
さらら: あら、でも、「ツリー構造を改造しなくてもいい」と言っても、さっきはしっかりimportでprint.xsdを取り込んで、そして各要素のデータ型定義の中で参照しないといけなかったじゃない。 たけち: 確かにそうだね。実際にシステムを運用する際には、本当にこういうprint:colorのようなグローバル属性が必要になってくるかどうかなんて、前もってわからないことがほとんどだよね。例えばprint:colorとはまた別の印刷に必要なグローバル属性が必要になってくるかもしれないしね。 さらら: えっ、えぇ。それはそうだわね。 たけち: そこで、大事になってくるのは、print:colorみたいな、グローバル属性だけでいろいろな仕事をしてくれるアプリケーションが使えるように、最初から「(任意の)どんな属性が出現してもよい」という設定を、すべての要素のデータ型の定義の中に仕込んでおくことなんだ。実際にそういうふうに改造した例を見てみようね。 |
■XMLデータ例とXML Schema例(xsd:anyAttributeを使用)
※XMLデータ例: xsd:anyAttribute |
※XML Schema例: 【manyouPoem.xsd】 xsd:anyAttribute |
さらら: あ、前回のxsd:anyにそっくりな、 たけち: そうだね。xsd:anyの部分がxsd:anyAttributeになった以外、まったく同じだよね。そして実際に、その中の属性の意味や使い方もまったく同じだよ。それから、xsi:schemaLocationの値も、 さらら: えぇ。 たけち: 前回の復習みたいになってしまうけれど、再度まとめると、次のようになるんだ。
|
■xsd:anyAttributeの注意事項
たけち: ##anyや##otherが他の設定と同時に使えないことも前回とxsd:anyと同じだね。processContents属性も同じだから、この説明についてはもう省略するね。 さらら: ほんと、そっくりねぇ。 |
たけち: ただし、xsd:anyと根本的に違うのは、出現制約に対する考え方なんだ。xsd:anyではminOccurs属性やmaxOccurs属性などを設定できたけれど、xsd:anyAttributeにはuse属性などは存在しないんだ。そしてnamesapce属性などの設定に従う限りは、複数のいろいろな種類の任意の属性が出現してもいいし、しなくてもいいわけなんだね。このあたりは、要素と属性の性質の違いが、こういう差を結果的に作り出したとも言えるね。 さらら: あ、そうかuse属性は使えないのね。...(^ ^; たけち: そしてもう一つ、次を見て欲しいんだけど。 |
※PoemType: xsd:anyAttributeを書く場所 |
たけち: 以前、複合型の定義の中では、内容モデルが最初に来て、その後にxsd:attributeやxsd:attributeGroupが来ないといけないという話をしたよね。 さらら: へぇ〜、こんなきまりがあるのね。 たけち: xsd:anyAttributeについてはこれでおしまい。次回はxsi:nilについて説明することにするね。 さらら: あっ、は〜い。ありがと。 次回はグローバル属性 - xsi:nil属性です...... (^ ^; |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |