2003年5月25日(日)更新 |
■XMLデータ例とXML Schema例(xsd:anyを使用)
たけち: 前回はDTDのANYについて学んだよね。 さらら: えぇ、DTDのANYだと次のような問題があったのね。
たけち: そうだね。で、今回はxsd:anyについてお話ししようね。まずは以下のXMLデータとXML Schemaを見てみよう。前回の例では敢えて名前空間を持たないXMLデータを示したけれど、これは名前空間を設定しているよ。 |
※XMLデータ例: 【report1.xml】 |
※XMLデータ例: 【report2.xml】 |
※XML Schema例: 【report.xsd】 |
■【report1.xml】と【report2.xml】の違い
たけち: まず【report1.xml】と【report2.xml】の違いを見てみようね。【report2.xml】では、XHTML系の要素も使われているよね。 さらら: えぇ。 たけち: 【report1.xml】では、 さらら: ほんとだわ。/p> たけち: 【report1.xml】では、名前空間とスキーマファイルのペアがひとつだけど、【report2.xml】では、ふたつになっているんだね。 |
■DTDのDOCTYPE宣言とXML Schemaのxsi:schemaLocation属性
さらら: ふ〜ん。 たけち: ここでDTDとの違いについて考えてもらいたいんだけれど、DTDのDOCTYPE宣言で指定できるスキーマファイルは1つだけだったよね。だから、先に作った【extendReport2.dtd】のように、スキーマファイルを融合させるだけのためのDTDを作らなくてはいけなかったね。もちろんこれと同様のことはXML Schemaでもimportを使えばできるけど、わざわざこれをしなくても、xsi:schemaLocation属性を使えば、複数のスキーマファイルを指定できるんだね。 さらら: なるほど、これは便利よね!(^ ^) |
たけち: さて、DTDと対応するXML Schema側の仕掛けをみてみようね。前回の、 さらら: |
■xsd:any namesapce="##other"
たけち: この、xsd:any要素というのは、「この場所に任意のどんな要素が来てもいいですよ」ということを示している要素なんだ。 さらら: う〜ん。それは何となくわかるけれど、namespace="##other"というのが全然わからないんだけど(^ ^;) |
たけち: そうだねぇ。。。xsd:any要素というのは、「この場所に任意のどんな要素が来てもいいですよ」という意味だと説明したけれど、だけどやみくもに何でも良いというわけじゃなくて、名前空間ごとに条件を設定できるんだよ。 さらら: 名前空間ごと? たけち: このnamespaceという属性によって、どういう名前空間の属性を許可するのかが設定できるようになるんだ。 さらら: あっ。そうなの。 たけち: 例えばこの場合のnamespace="##other"というのは、 さらら: そうなんだぁ。ということは、対象名前空間の要素は出現してはいけないのね。 たけち: そうそう。 |
たけち: そうそう。この場合の対象名前空間は、repという接頭辞であらわされるhttp://www.example.com/reportだから、この名前空間の要素だけは出現してはいけないんだ。だから、XMLデータは、エラーとしてはじくことができるんだよ。 |
※XMLデータ例: report.xsdに合致しない例 |
■xsd:any namesapce="##targetNamespace"
さらら: なるほどねぇ〜。これは使えるわね!(^ ^) たけち: 逆にこういうXMLデータを通そうと思うと、 さらら: へぇ、さっきは##otherだったけれど、これは##targetNamespaceなのね。 たけち: 他にもいくつものパターンを知っておこうね。
|
■xsd:anyの記述例
たけち: ここで注意して欲しいのは、 |
■processContents="lax"など
さらら: そう言われればそうよね。それからあと、processContents="lax"という属性がどういう意味なのかわからないんだけれど。 たけち: うん、このprocessContentsという属性なんだけれど、これはXMLデータをVailidatorが検証するする際に、どういうふうに検証するかとか、しないとかいったことを設定する属性なんだよ。 さらら: あっ、そっ、そう...(^ ^; ? たけち: このprocessContentsは、strict、lax、skipの3つの値のどれかをとるんだ。それぞれの意味は次のようなんだよ。 |
|
さらら: う〜ん、laxとかskipっていい加減なのね(^ ^;) たけち: まあ、そう言えるかもしれないね。ただ、DTDは定義されているけれど、XML Schemaでは定義されていないようなXMLの応用規格は実際には少なくないから、laxやskipなども場合によっては使うことも現実的な手段だね。 さらら: あっ、そっか。。。なるほどね。 |
たけち: もう一つだけ覚えておきたいのは、このxsd:any要素は、<xsd:element ref="○○">などと同様に、minOccursやmaxOccursなどの出現制約を設定できるということなんだ。例えば、 さらら: へぇ〜、こんな設定まで可能なのね。 たけち: 任意のどんな要素が出現してもよい、というxsd:anyについてはこれでおしまい。次回は、任意のどんな属性が出現してもよい、というxsd:anyAttributeについて解説するね。 さらら: あっ、は〜い。ありがと。 次回はxsd:anyAttributeです...... (^ ^; |
■XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。 |