xsi:schemaLocationとxsi:noNamespaceSchemaLocation(2)

2003年5月11日(日)更新


■xsi:noNamespaceSchemaLocation

たけち: 今回は、xsi:noNamespaceSchemaLocation属性について説明しようね。

さらら: はい。

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

さらら: えぇ。

たけち: ところが、XMLの中には名前空間を持たないXMLデータがあるよね。例えば次のXMLデータを見て。

XMLデータ例
<?xml version="1.0" encoding="UTF-8" ?>
<poem pno="4088">
<poet>大伴家持</poet>
<kana>左由理婆奈 由里毛安波牟等 於毛倍許曽 伊末能麻左可母 宇流波之美須礼</kana>
<yomi>さ百合花、ゆりも逢はむと、思へこそ、今のまさかも、うるはしみすれ</yomi>
</poem>

さらら: そういえば、何度も見てきた例よね。

たけち: これに対応するXML Schemaの例は次のようだね。

XML Schema例: 【mp3.xsd】
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

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

<xsd:complexType name="PoemType">
<xsd:sequence>
<xsd:element ref="poet" />
<xsd:element ref="kana" />
<xsd:element ref="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>

さらら: そうね。対象名前空間のないスキーマファイルだわね。

たけち: こういう対象名前空間のないスキーマファイルを指定したい場合には、xsi:schemaLocation属性ではなくて、代わりに、xsi:noNamespaceSchemaLocation属性を使うんだよ。次のようにね。

XMLデータ例: (xsi:noNamespaceSchemaLocationを使用)
<?xml version="1.0" encoding="UTF-8" ?>
     xsi:noNamespaceSchemaLocation="mp3.xsd"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<poet>大伴家持</poet>
<kana>左由理婆奈 由里毛安波牟等 於毛倍許曽 伊末能麻左可母 宇流波之美須礼</kana>
<yomi>さ百合花、ゆりも逢はむと、思へこそ、今のまさかも、うるはしみすれ</yomi>
</poem>

さらら: あっ、そっか〜。

たけち: これでわかってくれたかな。

さらら: よくわかったわ (^ ^) 要するに
名前空間を持ったスキーマファイルをXMLデータ側から指定したい場合は、xsi:schemaLocation属性を使って、
対象名前空間のないスキーマファイルを指定したい場合には、xsi:noNamespaceSchemaLocation属性を使うわけね。

たけち: そうだね。

さらら: そして、
    xsi:schemaLocation="名前空間    スキーマファイルのURL"
 って書くのよね。

さらら

■「名前空間」と「スキーマファイルのURL」のペアを記述

たけち: あっ、うーん、それはちょっとだけ違うんだ...(^ ^*

さらら: え、どう違うの?

たけち: もうちょっと正しく言うと次のように書くんだよ。

xsi:schemaLocationの書き方

たけち: つまり、指定したい名前空間とスキーマファイルのセットが複数ある場合には、こういうふうに並べて書くんだね。

さらら: へぇ、そうなのね。。。でも、「指定したい名前空間とスキーマファイルのセットが複数ある場合」って、どんな時かしら?
.......あ、わかった。複数の名前空間のスキーマをインポートしている場合なのね。例えばxml接頭辞の付いたグローバル属性-2のXMLスキーマのときは、他のXMLスキーマ(http://www.w3.org/2001/xml.xsd)をimportしていたわね。

XML Schema例: 【mpxml.xsd】(http://www.w3.org/2001/xml.xsdをimport)
<?xml version="1.0" encoding="UTF-8" ?>
<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:import namespace="http://www.w3.org/XML/1998/namespace"
     schemaLocation="http://www.w3.org/2001/xml.xsd"/>


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

<xsd:complexType name="PoemType">
<xsd:sequence>
<xsd:element ref="mp:img" />
<xsd:element ref="mp:poet" />
<xsd:element ref="mp:yomi" />
<xsd:element ref="mp:yaku" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" />
<xsd:attribute ref="xml:lang" />
<xsd:attribute ref="xml:base" />
</xsd:complexType>

<xsd:element name="img" type="mp:ImgType" />
<xsd:element name="poet" type="xsd:string" />
<xsd:element name="yomi" type="mp:YomiType" />
<xsd:element name="yaku" type="mp:YakuType" />

<xsd:complexType name="ImgType">
<xsd:attribute name="src" type="xsd:anyURI" />
</xsd:complexType>

<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="xml:space" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="YakuType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="xml:lang" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

</xsd:schema>

さらら: だから、XMLデータで次のように書かないといけないというわけなのね?

XMLデータ例: 万葉歌(英訳付き)
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem pno="4088"
    xsi:schemaLocation="http://www.yuragi.jp/ns/manyouPoem    mpxml.xsd
        http://www.w3.org/XML/1998/namespace    http://www.w3.org/2001/xml.xsd"
    xml:lang="ja"
     xml:base="http://www.example.com/manyou/"
     xmlns:mp="http://www.yuragi.jp/ns/manyouPoem"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<mp:img src="yuri4088.jpg" />
<mp:poet>
大伴家持</mp:poet>
<mp:yomi xml:space="preserve">
さ百合花         ゆりも逢はむと             思へこそ     今のまさかも         うるはしみすれ </mp:yomi>
<mp:yaku>
百合の花、また後にもお会いしたいと思うからこそ、今この時も、誠実に親しくするのですよ</mp:yaku>
<mp:yaku xml:lang="en">
I receive you warmingly with lovely lily, 'cause I hope we'll meet again</mp:yaku>
</mp:poem>

たけち

たけち: いや、それは違うんだよ。この場合は、XMLスキーマ 【mpxml.xsd】に
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"
     schemaLocation="http://www.w3.org/2001/xml.xsd"/>

 と書いてあるからこそ、このスキーマファイルを見れば、どこに参照したいスキーマファイルがあるかわかるよね。だから、この場合は、XMLデータにこの名前空間とスキーマファイル名を入れる必要はないんだよ。

さらら: あっ、そうなの。 (^ ^;

たけち: だから次のように書けばいいんだよ。

XMLデータ例: 万葉歌(英訳付き)
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem pno="4088"
    xsi:schemaLocation="http://www.yuragi.jp/ns/manyouPoem    mpxml.xsd
    xml:lang="ja"
     xml:base="http://www.example.com/manyou/"
     xmlns:mp="http://www.yuragi.jp/ns/manyouPoem"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<mp:img src="yuri4088.jpg" />
<mp:poet>
大伴家持</mp:poet>
<mp:yomi xml:space="preserve">
さ百合花         ゆりも逢はむと             思へこそ     今のまさかも         うるはしみすれ </mp:yomi>
<mp:yaku>
百合の花、また後にもお会いしたいと思うからこそ、今この時も、誠実に親しくするのですよ</mp:yaku>
<mp:yaku xml:lang="en">
I receive you warmingly with lovely lily, 'cause I hope we'll meet again</mp:yaku>
</mp:poem>


■「schemaLocation属性」と「xsi:schemaLocation属性」

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

たけち: ところで、
  <xsd:import
   namespace="http://www.w3.org/XML/1998/namespace"
   schemaLocation="http://www.w3.org/2001/xml.xsd"/>
 のようなXML Schemaのxsd:import要素のschemaLocation属性と、xsi:schemaLocation属性は、ローカル名が同じだから同じものだと誤解しやすいけれど、実は別物だから気をつけようね。

さらら: あ、そうなのね。でも、それだったら、どういう場合に、

xsi:schemaLocation="名前空間1    スキーマファイルのURL-1
                 名前空間2 スキーマファイルのURL-2
                   …          …
                 名前空間n スキーマファイルのURL-n"

 のような、指定したい名前空間とスキーマファイルのセットが複数ある場合があるのかしら?

さらら

たけち: う〜ん。それは、例えば、xsd:anyやxsd:anyAttributeを使っているような場合かな。

さらら: え、何それ? xsd:anyTypeのことじゃなくて、xsd:anyなの?

たけち: あ、これはまだ教えていなかったね(^^;) じゃあ、次回はxsd:anyについて勉強しようね。

さらら: あっ、はい。ありがとう。

次回はxsd:any(1)です...... (^ ^;

さらら

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