xsi:schemaLocationとxsi:noNamespaceSchemaLocation(1)

2003年5月4日(日)更新


■xsi:schemaLocation

さらら: ねぇ、たけち。XMLデータにDOCTYPE宣言を使うことによって、そのXMLデータがどういう外部DTDに従うのか、ということをDTDでは設定できたのよね。

たけち: そうだね。たとえば次のようなことだよね。

XMLデータ例(DOCTYPE宣言にSYSTEMを記述)
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE mp:poem SYSTEM "mp.dtd">
    <mp:poem pno="4088" xmlns:mp="http://www.yuragi.jp/ns/manyouPoem">
    <mp:poet>大伴家持</mp:poet>
    <mp:kana>左由理婆奈 由里毛安波牟等 於毛倍許曽 伊末能麻左可母 宇流波之美須礼</mp:kana>
    <mp:yomi>さ百合花、ゆりも逢はむと、思へこそ、今のまさかも、うるはしみすれ</mp:yomi>
</mp:poem>

DTD: 【mp.dtd】
<!ELEMENT mp:poem (mp:poet, mp:kana, mp:yomi)>
<!ATTLIST mp:poem pno NMTOKEN #REQUIRED xmlns:mp CDATA #FIXED "http://www.yuragi.jp/ns/manyouPoem" >
<!ELEMENT mp:poet (#PCDATA)>
<!ELEMENT mp:kana (#PCDATA)>
<!ELEMENT mp:yomi (#PCDATA)>

たけち: この例ではDOCTYPE宣言で、【mp.dtd】というDTDに従うことを指定しているね。ついでに、【mp.dtd】に相当するXML Schema【mp.xsd】をみておこうね。

XML Schema例: 【mp.xsd】
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema targetNamespace="http://www.yuragi.jp/ns/manyouPoem"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:mp="http://www.yuragi.jp/ns/manyouPoem">

<xsd:element name="poem" type="mp:PoemType" />

<xsd:complexType name="PoemType">
<xsd:sequence>
<xsd:element ref="mp:poet" />
<xsd:element ref="mp:kana" />
<xsd:element ref="mp:yomi" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" />
</xsd:complexType>

<xsd:element name="poet" type="xsd:string" />
<xsd:element name="kana" type="xsd:string" />
<xsd:element name="yomi" type="xsd:string" />

</xsd:schema>

さらら: それで不思議に思ったんだけれど、DTDならDOCTYPE宣言を使ってXMLデータ側から指定できるけれど、XML SchemaはXMLデータ側から指定できないのかしら?

たけち: あっ、もちろんできるよ。

さらら: よかった。じゃあ、教えて(^ ^;)

たけち: そうだね。まずは解説は後回しで次のXMLデータを見てみようね。


■xsi:schemaLocation

XMLデータ例: スキーマとして【mp.xsd】を指定
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem pno="4088"
     xsi:schemaLocation="http://www.yuragi.jp/ns/manyouPoem mp.xsd"
     xmlns:mp="http://www.yuragi.jp/ns/manyouPoem"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <mp:poet>大伴家持</mp:poet>
    <mp:kana>左由理婆奈 由里毛安波牟等 於毛倍許曽 伊末能麻左可母 宇流波之美須礼</mp:kana>
    <mp:yomi>さ百合花、ゆりも逢はむと、思へこそ、今のまさかも、うるはしみすれ</mp:yomi>
</mp:poem>

さらら: わかったわ!
xsi:schemaLocation="http://www.yuragi.jp/ns/manyouPoem mp.xsd"
 という属性の中にmp.xsdと書いてあるから、ここでスキーマファイルを指定しているのね。

たけち: そのとおりだよ(^ ^)

さらら: その前に書いてある http://www.yuragi.jp/ns/manyouPoemというのは、名前空間の名前よね。

さらら

たけち: そうだよ。この
xsi:schemaLocation="http://www.yuragi.jp/ns/manyouPoem mp.xsd"は、
「http://www.yuragi.jp/ns/manyouPoemという名前空間を、対象名前空間として定義しているのはmp.xsdですよ。」という意味なんだね。


■xsi:schemaLocation属性の名前空間

さらら: なるほど。こういうふうに指定するわけね。それにしても、このxsi:schemaLocation属性のxsiって、また新しい名前空間が出てきたわ。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" って、一見、XML Schemaによく似ているけれど。

たけち: そうだね。XML Schemaの名前空間は今までずっと見てきたように、"http://www.w3.org/2001/XMLSchema" であって、これに対しては、xsd または xs という接頭辞を割り当てることが一般的だったんだね。
それに対して、よく似た名前だけれど、"http://www.w3.org/2001/XMLSchema-instance" という名前空間をここで使っているんだ。最後に「-instance」という言葉が付いていることが違いだね。そして、この名前空間に対しては xsi という接頭辞を割り当てることが一般的なんだよ。

さらら

さらら: 名前空間の名前が違うということは、"http://www.w3.org/2001/XMLSchema" と "http://www.w3.org/2001/XMLSchema-instance" は別物なのよね。

たけち

たけち: そうだね。ただし、まるっきり無関係というわけではなくて、名前が似ていることからもわかるように、両者は特別な関係にあるんだ。
前回、xmlという名前空間接頭辞で表される "http://www.w3.org/XML/1998/namespace" という名前空間は、XMLの規格自身から特別扱いされる名前空間であることを説明したね。

さらら: あっ、そうだったわね。(^ ^;

たけち: この
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 という名前空間は、XML Schema規格自身から特別扱いされている名前空間なんだよ。

さらら: XML Schemaから特別扱いされているの?


■特別扱いの4種類のグローバル属性

たけち: そう。このxsiの名前空間には、つぎの4種類のグローバル属性が属しているんだ。

  • xsi:schemaLocation属性
  • xsi:noNamespaceSchemaLocation属性
  • xsi:type属性
  • xsi:nil属性

さらら: あら、また新しい属性が・・・・(^ ^;

たけち: このうち、xsi:type属性とxsi:nil属性については、また後で説明することにして、今回はxsi:schemaLocation属性とxsi:noNamespaceSchemaLocation属性の説明にしておくね。

さらら: えぇ。

たけち: この4種類のグローバル属性に共通する性質はつぎのことなんだ。

  1. XMLデータ(instance)の中で使われる。
  2. XMLデータ(instance)のどこに使われても、その存在そのものはXML Schema側で定義しなくても良い。

さらら: え??

さらら

たけち: 例えば、さっきの【mp.xsd】をよく見てごらん。どこにも、xsi:schemaLocation属性が出現するよう定義は書いていないよね。でも、mp.xsdはそれでもこれの検証はOKとしているんだね。XML規格から特別扱いされているxml接頭辞を持った属性であるxml:langやxml:spaceでも、それをXMLデータの中で出現させようと思ったら、xml.xsdをインポートして、参照しないといけなかったよね。

さらら: えぇ。

たけち: でも、"http://www.w3.org/2001/XMLSchema-instance"の名前空間に属している4種類のグローバル属性は、それを定義せずに、XMLデータのどの要素の中でも使えるんだね。

さらら: へぇ〜、そんな特別扱いされているのね。

たけち: ただし、この4種類のxsi接頭辞のグローバル属性を特別扱いしてくれるのは、XML Schemaだけなんだよ。例えば、mp2.xmlを【mp.dtd】で検証しようとするとエラーになるんだ。DTDはこれらを特別扱いしてくれないんだね。だから、mp2.xmlを検証するDTDを書くのだったら、例えばだけどね、次のように書かなくちゃいけないんだ。

DTD例: xmlns:xsiを意識
<!ELEMENT mp:poem (mp:poet, mp:kana, mp:yomi)>
<!ATTLIST mp:poem
    pno NMTOKEN #REQUIRED
    xsi:schemaLocation CDATA #IMPLIED
    xmlns:mp CDATA #FIXED "http://www.yuragi.jp/ns/manyouPoem"
    xmlns:xsi CDATA #FIXED "http://www.w3.org/2001/XMLSchema-instance"
    >
<!ELEMENT mp:poet (#PCDATA)>
<!ELEMENT mp:kana (#PCDATA)>
<!ELEMENT mp:yomi (#PCDATA)>

さらら: あ、そうなのね(^^;)

たけち: こういうふうにXML Schemaと密接に関わっているグローバル属性だから、DTDや他のスキーマ言語も併用するような場合には、使用するのに注意が必要だよ。

さらら: は〜い。

たけち: そうだね。(^ ^; 今回はこれでおしまいにするね。次回は、xsi:noNamespaceSchemaLocation属性についても説明しておこうね。

さらら: はい。

次回は、xsi:schemaLocationとxsi:noNamespaceSchemaLocation(2)です...... (^ ^;

さらら

XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。