include

2003年2月9日(日)更新


■同じ名前空間のスキーマを参照する

たけち: 前回は異なる名前空間のスキーマを参照する方法について勉強したよね。

さらら: そうね、importだったわね。

たけち: ところで、異なる名前空間のスキーマを参照する方法があるんだったら、同じ名前空間のスキーマを参照する方法があってもいいよね。

さらら: あ、それはそうね。それって、一つのスキーマの定義が複数のファイルに分散するってことなの?

たけち: そう、そういうことだね。まずは前回と似た例を見てみようね。

さらら

XMLデータ例: 万葉歌人-1
<?xml version="1.0" encoding="Shift_JIS" ?>
<pi:person id="3" xmlns:pi="http://www.yuragi.jp/ns/personalInformation">
<pi:name>大伴家持</pi:name>
<pi:sex>male</pi:sex>
<pi:birth>0718</pi:birth>
<pi:death>0785</pi:death>
</pi:person>

たけち: このXML Schemaはどう書けばいいか、もうわかるよね。

さらら: え、えっと(^ ^;)

XML Schema例: 万葉歌人-1 【pi1.xsd】
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema targetNamespace="http://www.yuragi.jp/ns/personalInformation"
           xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:pi="http://www.yuragi.jp/ns/personalInformation">

<xsd:element name="person" type="pi:PersonType" />

<xsd:complexType name="PersonType">
<xsd:sequence>
<xsd:element ref="pi:name" />
<xsd:element ref="pi:sex" />
<xsd:element ref="pi:birth" />
<xsd:element ref="pi:death" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:positiveInteger" />
</xsd:complexType>

<xsd:element name="name" type="xsd:string" />
<xsd:element name="sex" type="pi:SexType" />
<xsd:element name="birth" type="xsd:gYear" />
<xsd:element name="death" type="xsd:gYear" />

<xsd:simpleType name="SexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male" />
<xsd:enumeration value="female" />
</xsd:restriction>
</xsd:simpleType>

</xsd:schema>

さらら: どうかしら。

たけち: そうだね。このスキーマの名前をここでは【pi1.xsd】としておこうか。さてここから、前回見たような、万葉歌人のデータについてXMLデータのXML Schemaを作ってみよう。

XMLデータ例: 万葉歌人-2
<?xml version="1.0" encoding="Shift_JIS" ?>
<pi:people xmlns:pi="http://www.yuragi.jp/ns/personalInformation">

<pi:person id="1">
<pi:name>持統天皇</pi:name>
<pi:sex>female</pi:sex>
<pi:birth>0645</pi:birth>
<pi:death>0702</pi:death>
</pi:person>

<pi:person id="2">
<pi:name>高市皇子</pi:name>
<pi:sex>male</pi:sex>
<pi:birth>0654</pi:birth>
<pi:death>0696</pi:death>
</pi:person>

<pi:person id="3">
<pi:name>大伴家持</pi:name>
<pi:sex>male</pi:sex>
<pi:birth>0718</pi:birth>
<pi:death>0785</pi:death>
</pi:person>

<pi:person id="4">
<pi:name>坂上郎女</pi:name>
<pi:sex>female</pi:sex>
<pi:birth>0700</pi:birth>
<pi:death>0750</pi:death>
</pi:person>

<pi:person id="5">
<pi:name>柿本人麻呂</pi:name>
<pi:sex>male</pi:sex>
<pi:birth>0645</pi:birth>
<pi:death>0701</pi:death>
</pi:person>

</pi:people>

さらら: え〜っと。これって、前回は次のようなXML Schemaだったわね。

XML Schema例: 万葉歌人-2
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema
             targetNamespace="http://www.yuragi.jp/ns/personalInformation"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:pi="http://www.yuragi.jp/ns/personalInformation">

<xsd:element name="people" type="pi:PeopleType" />

<xsd:complexType name="PeopleType">
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="pi:person" />
</xsd:sequence>
</xsd:complexType>


<xsd:element name="person" type="pi:PersonType" />

<xsd:complexType name="PersonType">
<xsd:sequence>
<xsd:element ref="pi:name" />
<xsd:element ref="pi:sex" />
<xsd:element ref="pi:birth" />
<xsd:element ref="pi:death" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:positiveInteger" />
</xsd:complexType>

<xsd:element name="name" type="xsd:string" />
<xsd:element name="sex" type="pi:SexType" />
<xsd:element name="birth" type="xsd:gYear" />
<xsd:element name="death" type="xsd:gYear" />

<xsd:simpleType name="SexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male" />
<xsd:enumeration value="female" />
</xsd:restriction>
</xsd:simpleType>

</xsd:schema>

たけち: 前回はそうだったね。さて、このスキーマと、最初に示した「pi1.xsd」というスキーマを比較してみるとわかるけれど、違いは

<xsd:complexType name="PeopleType">
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="pi:person" />
</xsd:sequence>
</xsd:complexType>

たけち: の部分があるかないかだけだよね。ということは【pi1.xsd】が先にあるものとして、それを参照して書けば、簡単に短く同じものが書けると思わないかい。

さらら: あっ、そういえばそうねぇ〜。でも、どう書けばいいのかしら。

たけち: で、この場合は次のように書くんだ。


■【pil.xsd】をincludeする例

XMLスキーマ例: 万葉歌人-2: 【pil.xsd】をinclude
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema targetNamespace="http://www.yuragi.jp/ns/personalInformation"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:pi="http://www.yuragi.jp/ns/personalInformation">

<xsd:include schemaLocation="pi1.xsd" />

<xsd:element name="people" type="pi:PeopleType" />

<xsd:complexType name="PeopleType">
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="pi:person" />
</xsd:sequence>
</xsd:complexType>

</xsd:schema>

さらら: あら、何か前回とよく似ているような...

たけち: そうだね。参照するということでは変わりがないからね。見て欲しいのは、
      <xsd:include schemaLocation="pi1.xsd" />
の部分だよ。前回はimportを学んだけれど、今回はincludeと言うんだ。
includeというのは日本語に訳すと「含める」という意味かな。importと同様にschemaLocation属性が存在していて、そこに参照したいファイル名を書くんだ。

さらら: えぇ、分かるわ。

たけち: ただしimportと違って、includeではnamespace属性が存在しないんだよ。includeの場合は、同じ名前空間のスキーマを参照することが決まっているから、importのようなnamespace属性は必要ないんだね。

さらら: そっかぁ。なるほど、わかったわ(^ ^*)

たけち: 次回はincludeに少し似ているけれども、それをさらに発展させたようなredfineについて勉強するね。

さらら: あっ、は〜い!!

次回はredefineです。...... (^ ^)v

さらら

■(注)
 この節では敢えて「対象名前空間を持たないスキーマのinclude」という問題を説明しませんでした。これには以下の2つの理由があります。
    (1) 対象名前空間を持たないスキーマを、includeによって、色々な名前空間のスキーマに変更してしまうことは、名前空間の思想そのものと相容れないところがあるため。
    (2) 「対象名前空間を持たないスキーマのinclude」による動作が、一部の解説書が書いてある動作と、代表的なValidatorの実際の動作とで食い違いがあること。
このため、本節では敢えてこのことを説明しませんでした。


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