グローバル属性とグローバル属性宣言 その5

2003年4月6日(日)更新


■(例-1) 要素ごとのcolor属性をローカル属性宣言する

たけち: 前回は実際のXML Schemaのコードは出さずに、概念的なことばかりを話していたから、ちょっとわかりにくかったよね。

さらら: えっ、えぇ・・・(^ ^;

たけち: 今回は、実際のコードを見ながら、具体的にどうなるかを見ていくことにするね。まずは次の例をどう書くかを考えてみようね。

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

さらら: 前にみた例ね。

たけち: このXMLデータのDTDとXML Schemaは次のようになるね。

上記XMLインスタンスに対応するDTD
<!ELEMENT mp:poem (mp:poet, mp:kana, mp:yomi)>
<!ATTLIST mp:poem pno CDATA #REQUIRED xmlns:mp CDATA #FIXED "http://www.yuragi.jp/ns/manyouPoem" >
<!ELEMENT mp:poet (#PCDATA)>
<!ATTLIST mp:poet color (black | blue | red | yellow) #IMPLIED>
<!ELEMENT mp:kana (#PCDATA)>
<!ATTLIST mp:kana color (black | blue | red | yellow) #IMPLIED>
<!ELEMENT mp:yomi (#PCDATA)>
<!ATTLIST mp:yomi color (black | blue | red | yellow) #IMPLIED>

上記XMLインスタンスに対応するXML Schema
<?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" use="required" />
</xsd:complexType>

<xsd:element name="poet" type="mp:PoetType" />
<xsd:element name="kana" type="mp:KanaType" />
<xsd:element name="yomi" type="mp:YomiType" />

<xsd:complexType name="PoetType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="color" type="mp:ColorType" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="KanaType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="color" type="mp:ColorType" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="color" type="mp:ColorType" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:simpleType name="ColorType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="black" />
<xsd:enumeration value="blue" />
<xsd:enumeration value="red" />
<xsd:enumeration value="yellow" />
</xsd:restriction>
</xsd:simpleType>


</xsd:schema>

たけち: ちなみに、このDTDをパラメータエンティティを使って書くと次のようになるね。、

DTD: パラメータエンティティを使用
<!ENTITY % colorGroup "color (black | blue | red | yellow) #IMPLIED">
<!ELEMENT mp:poem (mp:poet, mp:kana, mp:yomi)>
<!ATTLIST mp:poem pno CDATA #REQUIRED xmlns:mp CDATA #FIXED "http://www.yuragi.jp/ns/manyouPoem">
<!ELEMENT mp:poet (#PCDATA)>
<!ATTLIST mp:poet %colorGroup;>
<!ELEMENT mp:kana (#PCDATA)>
<!ATTLIST mp:kana %colorGroup;>
<!ELEMENT mp:yomi (#PCDATA)>
<!ATTLIST mp:yomi %colorGroup;>

たけち: またこのXML Schemaを、名前付き属性グループを使って書くと、次のようになるね。

W3C XML Schema: 名前付き属性グループを使用
<?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" use="required" />
</xsd:complexType>

<xsd:element name="poet" type="mp:PoetType" />
<xsd:element name="kana" type="mp:KanaType" />
<xsd:element name="yomi" type="mp:YomiType" />

<xsd:complexType name="PoetType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attributeGroup ref="mp:colorGroup" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="KanaType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attributeGroup ref="mp:colorGroup" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attributeGroup ref="mp:colorGroup" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:attributeGroup name="colorGroup">
<xsd:attribute name="color" type="mp:ColorType" />
</xsd:attributeGroup>


<xsd:simpleType name="ColorType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="black" />
<xsd:enumeration value="blue" />
<xsd:enumeration value="red" />
<xsd:enumeration value="yellow" />
</xsd:restriction>
</xsd:simpleType>


</xsd:schema>

たけち: いいよね。

さらら: えぇ。

たけち: 今まで学んできたように、このcolorという属性は、所属する要素に関係なく、一定の目的を持って一定のデータ型をとる属性なんだよね。ということは、名前空間接頭辞の付いたグローバル属性にした方がいいよね。

さらら: あっ、そうよね。


■(例-2) color属性をグローバル属性宣言する

たけち: その場合、XMLデータは次のようになるよね。

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

さらら: そうね、このmp:colorが名前空間接頭辞付きの属性なのよね。

たけち: 前にも少し実際の例を見たけれど、この場合、XML Schemaは次のように書くことができるんだよ。

W3C XML Schema: 名前付き属性グループを使用
<?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" use="required" />
</xsd:complexType>

<xsd:element name="poet" type="mp:PoetType" />
<xsd:element name="kana" type="mp:KanaType" />
<xsd:element name="yomi" type="mp:YomiType" />

<xsd:complexType name="PoetType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="mp:color" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="KanaType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="mp:color" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

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

<xsd:attribute name="color" type="mp:ColorType" />

<xsd:simpleType name="ColorType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="black" />
<xsd:enumeration value="blue" />
<xsd:enumeration value="red" />
<xsd:enumeration value="yellow" />
</xsd:restriction>
</xsd:simpleType>


</xsd:schema>

たけち: ここで見て欲しいのが、
<xsd:attribute name="color" type="mp:ColorType" />
という属性宣言が、複合型定義の中にあるのではなくて、xsd:schema要素の直接の子要素として存在するということなんだ。このように、xsd:schema要素の直接の子要素としての属性宣言をグローバル属性宣言と呼ぶんだ。

さらら: へぇ〜。

たけち: それに対して、今まで見てきたような複合型定義の中で行われる属性宣言をローカル属性宣言と呼ぶんだよ。上記のような場合、今度は複合型定義の中で、
<xsd:attribute ref="mp:color" />
 と参照されてるよね。そのために、実際にXMLデータ側では、mp:colorという対象名前空間の名前空間接頭辞がついた属性になるわけなんだね。

さらら: なるほど。グローバル属性宣言をすることによって、こういう名前空間接頭辞がついた属性、つまりグローバル属性になるわけなのね。

たけち: と、簡単に言い切ってしまえるといいけれど、必ずしもそうじゃない場合があるんだよね。

さらら: えっ。(^ ^;

たけち: じゃあ、名前空間を持たないXMLデータの場合について次回にお話しようね。

さらら: あっ。はい。

グローバル属性とグローバル属性宣言 その6に続きます...... (^ ^;

さらら

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