対象名前空間

2003年1月26日(日)更新


■DTDでは名前空間は扱えない

たけち: 前回は名前空間の重要性について話をしたけれど、具体的なXML Schemaの書き方については、ほとんど説明しなかったよね。今回から名前空間を使ったXML Schemaの書き方を学んでいこうね。

さらら: は〜い。でも、お手柔らかにね。(^ ^;

たけち: まず次の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>

たけち: 今までも何回も出てきたようなパターンで、それに名前空間とその接頭辞が設定された、というところだね。まずこれのDTDについて書いてみよう。

さらら: やっぱり最初はDTDなのね...(^ ^;) でも、DTDだと、名前空間は扱えなかったんじゃないの?

たけち: そう、本当はDTDでは名前空間は扱えないけれど、以下のようにごまかして書くことができるんだ。

DTD例: 万葉歌-1
<!ELEMENT mp:poem (mp:poet, mp:yomi)>
<!ATTLIST mp:poem pno NMTOKEN #REQUIRED>
<!ATTLIST mp:poem xmlns:mp CDATA #FIXED
                "http://www.yuragi.jp/ns/manyouPoem">
<!ELEMENT mp:poet (#PCDATA)>
<!ELEMENT mp:yomi (#PCDATA)>

さらら: あ、なるほどね。これだとちゃんとDTDになっているわね。

たけち: そう、こういう書き方で一応はごまかすことができるんだね。(^ ^;) でも、この書き方にはいろいろと問題があって、例えば、接頭辞がmp以外になった場合とか、デフォルト名前空間になった場合に対応できないんだ。これがDTDが名前空間を扱う際に困ることの一つなんだよね。

さらら: デフォルト名前空間って何?

たけち: う〜ん。。。じゃあ、最初に名前空間に対応したXML Schemaの書き方を説明して、その後でデフォルト名前空間について説明しよう。まずは名前空間に対応したXML Schemaの書き方からだよ。


■名前空間に対応したXML Schemaの書き方

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>

さらら: 今までの書き方とちょっと違うわね。見慣れない言葉があるわ...(^ ^;)

たけち: そうだね。まず新しく出てきたものとして、xsd:schema要素の中に
targetNamespace="http://www.yuragi.jp/ns/manyouPoem"
 という属性があるよね。これが一番大事で、targetNamespace というのは、このスキーマによって定義したい名前空間を意味しているんだ。日本語に訳すと対象名前空間という意味かな。
この属性が存在すると、要素の直下の子要素となるsimpleTypeやcomplexTypeなどのデータ型、group(名前付きモデルグループ定義)やattributeGroup(名前付き属性グループ定義)、そして宣言された要素や属性、さらに要素宣言の子要素として定義されるキー(key)などはすべて、
http://www.yuragi.jp/ns/manyouPoemという名前空間に属している、
という意味になるんだね。

さらら: ふ〜ん、そうなのね。

たけち: それから、group(名前付きモデルグループ定義)やattributeGroup(名前付き属性グループ定義)の例も見ておこうね。さっきのXMLデータと似ている次のXMLデータを考えてみよう。

たけち

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

たけち: このXMLデータを、group(名前付きモデルグループ定義)やattributeGroup(名前付き属性グループ定義)も使ったスキーマで定義してみるね。

XML Schema例: 万葉歌-2
<?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:group ref="mp:core_element" />
</xsd:sequence>
<xsd:attributeGroup ref="mp:core_attribute" />
</xsd:complexType>

<xsd:group name="core_element">
<xsd:sequence>
<xsd:element ref="mp:poet" />
<xsd:element ref="mp:yomi" />
</xsd:sequence>
</xsd:group>

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

<xsd:attributeGroup name="core_attribute">
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
<xsd:attribute name="emotion" type="xsd:string" use="optional" />
</xsd:attributeGroup>

</xsd:schema>
</xsd:schema>


■接頭辞をつける個所とつけない個所

さらら: え〜と、ねえ、これを見てちょっと不思議に思ったんだけれど... 要素名やデータ型名や名前付きモデルグループ名、名前付き属性グループ名には、mp という接頭辞がついているものと、ついていないものがあるわ。

たけち: そう、ここが初めて勉強する人にとってはややこしいところなんだけれど、一言で言うと、次のように言えるんだ

接頭辞をつける/つけない

さらら: ふ〜ん。そうなんだ。。。

たけち: もう少し大雑把に言うと、
name="○○"
 の中の○○は、たいてい定義したいデータ型名、要素名、属性名、名前付きモデルグループ名、名前付き属性グループ名、キー名だから、これらには接頭辞はつけないんだよ。
何故ならこれらが http://www.yuragi.jp/ns/manyouPoem という名前空間に属しているということが、
targetNamespace="http://www.yuragi.jp/ns/manyouPoem"
 という部分で決まることだからなんだよね。

さらら: う〜ん。。。

たけち: これに対して、
type="○○"
ref="○○"
 という○○は、参照したいデータ型名、要素名、属性名、名前付きモデルグループ名、名前付き属性グループ名だから、これらには接頭辞をつけるんだよ。このルールはちょっとややこしそうだけれど、書いているとすぐに慣れるよ(^^;)

たけち

さらら: う〜ん、確かにややこしそう。でもまあ書いていれば慣れるのね。

たけち: そう、気をつけて何回も練習していれば、そのうちなんともなくなるよ。それからここで注意してもらいたいのは、このtargetNamespace属性は、あくまでXML Schemaの(最上位の)ルート要素である要素のみが持ちうる属性だということなんだよ。つまり、XML Schemaでは、スキーマを定義した一つのファイルは、一つの名前空間のスキーマしか定義できないか、もしくは前回まで見てきたような名前空間を持たないスキーマの定義になっているか、のどちらかしかないんだ。だから例えば、3つの名前空間を扱っているようなXMLデータの場合、それぞれの名前空間についてスキーマを定義したファイルが、最低でも合計3つは必要だということなんだね。

さらら: ふ〜ん、何か今ひとつよくわからないけれど...

たけち: まあこれは、これから実例が出てきだすと、だいだいわかってくると思うよ(^^;) 次回は、「スキーマ文書のimport」について勉強することにするね。

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

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

さらら


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