import

2003年2月2日(日)更新


■名前空間の復習

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

さらら: は〜い。

たけち: まず前回の復習からね。次のXMLデータを見て。

さらら

XMLデータ例: 万葉歌-1
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem pno="0408" xmlns:mp="http://www.yuragi.jp/ns/manyouPoem">
<mp:poet>大伴家持</mp:poet>
<mp:yomi>なでしこがその花にもが朝な朝な手に取り持ちて恋ひぬ日なけむ</mp:yomi>
</mp:poem>

さらら: えぇ、覚えているわ。

たけち: これに対応するXMLスキーマは次のようなものだったね。

XML Schema例: 万葉歌-1
<?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:yomi" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
</xsd:complexType>

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

</xsd:schema>

さらら: えぇ、そうだったわ。

たけち: じゃあ、次に前回勉強したことが身についているかどうか、次のXMLデータのスキーマはどうなるかな?

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>

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

たけち: そうだね。次のような感じになるね。ちなみにこのスキーマファイルの名前を仮に【pi.xsd】としておくね。

たけち

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>

さらら: あ、そうね、こんな感じになるわね.....(^ ^; ところで、xsd:gYearってなに?

たけち: あっ、これは今まで使ってこなかったけれど、これもXML Schemaのビルトインデータ型で西暦の年号を表すものなんだよ。

さらら: そうなんだぁ。

たけち: さて、ここまでは前回までの応用なんだけれど、じゃあ次のXMLデータを見てみようか。


■異なる名前空間の要素から成るXMLデータ

たけち: 先の2つのデータ型を融合させたようなXMLデータだよ。

さらら: データを融合?

XMLデータ例: 万葉歌-3
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem pno="0408"
             xmlns:mp="http://www.yuragi.jp/ns/manyouPoem"

             xmlns:pi="http://www.yuragi.jp/ns/personalInformation">
<pi:person>
    <pi:name>大伴家持</pi:name>
    <pi:sex>male</pi:sex>
    <pi:birth>0718</pi:birth>
    <pi:death>0785</pi:death>
</pi:person>

<mp:yomi>なでしこがその花にもが朝な朝な手に取り持ちて恋ひぬ日なけむ</mp:yomi>
</mp:poem>

さらら: あら、これmp:poet要素の代わりに、pi:person要素が入ったのね。

たけち: そうだね。
これはmp、つまり"http://www.yuragi.jp/ns/manyouPoem"の名前空間のスキーマが、
pi、つまり"http://www.yuragi.jp/ns/personalInformation"という名前空間のスキーマを取り込んだ形になっているんだよね。

さらら: こんな書き方ができるわけね。

たけち: そうだね。こういう異なる名前空間の要素を組み合わせる方法ができるんだよね。さて、これのXML Schemaの書き方を見てみようね。pi、つまり"http://www.yuragi.jp/ns/personalInformation"のスキーマファイルは、ここでは【pi.xsd】としておくね。

さらら

XML Schema例: 万葉歌-3
<?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"
             xmlns:pi="http://www.yuragi.jp/ns/personalInformation">

<xsd:import
             namespace="http://www.yuragi.jp/ns/personalInformation"
             schemaLocation="
pi.xsd" />

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

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

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

</xsd:schema>

さらら: あら、意外にあっさりと書けるのね。よくわからないのは、
<xsd:import
             namespace="http://www.yuragi.jp/ns/personalInformation"
             schemaLocation="
pi.xsd" />
 の部分だけだわ。

たけち: そう。問題になるのは、この部分だけで、後はわかるよね。pi、つまり"http://www.yuragi.jp/ns/personalInformation"のスキーマファイルを参照するために必要な書き方なんだよ。

さらら: importというのは「持ち込む」「導入する」「輸入する」とかの意味だったわね。

たけち

たけち: で、namespaceという属性は、導入したい名前空間の名前を書く場所だね。ここではpiという接頭辞ではなくて、名前空間の正式名称である"http://www.yuragi.jp/ns/personalInformation"を書かないといけないんだよ。そして次のschemaLocationというのが、その名前空間のスキーマファイルのある場所というか名前で、ここではpi.xsdと書いているんだよ。

さらら: そうなのね。

たけち: ちなみにこのpi.xsdが、仮にインターネット上のhttp://www.yuragi.jp/schema/pi.xsdにあるような場合には、
<xsd:import
             namespace="http://www.yuragi.jp/ns/personalInformation"
             schemaLocation="
http://www.yuragi.jp/schema/pi.xsd" />
 という書き方になるんだよ。

さらら: へぇ〜。。。

たけち: 以前、名前空間を本籍地に例えて説明したけれど、この場合、namespace属性、つまり名前空間が本籍地で、schemaLocation属性、つまりスキーマファイルの置き場所が現住所のようなものだね。本籍地と現住所が両方書いてあるなんて、自動車の免許証みたいだね (^ ^;

さらら: 自動車って? (?_?)

たけち: あっ (^ ^;) えーと、話を戻すと、こう書くことによってpiのスキーマが参照できるようになるんだね。だから、pi.xsdの方で
<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>

 と宣言されたpi:person要素が、

<xsd:complexType name="PoemType">
<xsd:sequence>
<xsd:element ref="pi:person" />
<xsd:element ref="mp:yomi" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" />
</xsd:complexType>
 というふうにmp:PoemTypeの定義の中で参照できたわけなんだよ。

たけち

さらら: なるほど、そうなのね。xsd:importという要素の書き方さえ覚えておけば、意外に簡単なのね (^ ^*)

たけち: そうだね。この例ではpi.xsdの中で宣言された要素を参照したけれど、こんなふうにxsd:schema要素の直下の子要素として宣言される要素を参照できるんだよ。この他に参照できるものとしては、xsd:schema要素の直下の子要素として出現して定義や宣言をされる、complexType, simpleType, group(名前付きグループ定義), attributeGroup(名前付き属性グループ定義), attributeなどを参照できるんだよ。

さらら: へぇー、そうなのね。えっ? xsd:schema要素の直下の子要素として出現して宣言されるattribute...? そんなもの、あったかしら?

たけち: あ、それについては、また後で説明するね。

さらら: えっ、えぇ。

さらら

■対象名前空間を持たないスキーマをimportする

たけち: それから、対象名前空間を持たないスキーマをimportする場合についても説明しておくね。次のように、対象となる名前空間を持たないスキーマがあるとしようね。このスキーマファイルを仮にpiNoNS.xsdという名前にしておこうね。

XML Schema例: piNoNS.xsd
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

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

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

<xsd:element name="name" type="xsd:string" />
<xsd:element name="sex" type="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>

たけち: これをimportするスキーマは以下のように書けるんだよ。

XML Schema例: piNoNS.xsdをimport
<?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"
             xmlns:pi="http://www.yuragi.jp/ns/personalInformation">

<xsd:import schemaLocation="piNoNS.xsd" />

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

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

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

</xsd:schema>

さらら: 前のとほとんど変わらないように見えるけれど...

たけち: 違いは2箇所あるんだ。まずxsd:import要素のnamespace属性がなくなったことだね。対象名前空間を持たないスキーマだから、名前空間の名前を書きようがないよね。それから、
<xsd:element ref="pi:person" />
 の部分が、
<xsd:element ref="person" />
 に変わったよね。

さらら: あ、そうね。

たけち: それで、このスキーマに合致するXMLデータは次のような感じになるんだよ。

さらら

XMLデータ例: 万葉歌-3
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem pno="0408"
             xmlns:mp="http://www.yuragi.jp/ns/manyouPoem">

<person>
    <name>大伴家持</name>
    <sex>male</sex>
    <birth>0718</birth>
    <death>0785</death>
</person>

<mp:yomi>なでしこがその花にもが朝な朝な手に取り持ちて恋ひぬ日なけむ</mp:yomi>
</mp:poem>

さらら: あ、こんなXMLの書き方ができるのね (^ ^;)

たけち: 今回は異なる名前空間のスキーマを参照するためのimportを学んだけれど、次回は同じ名前空間のスキーマを参照するincludeについて勉強するね。

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

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

さらら

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