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

2003年4月13日(日)更新


■対象名前空間を持たないXMLデータ

たけち: 例えば、前回考えたXML Schemaが対象名前空間を持たなかったら、グローバル属性がどうなるかを考えてみようね。

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

対象名前空間を持たないXML Schema例
<?xml version="1.0" encoding="Shift_JIS" ?>
<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" use="required" />
</xsd:complexType>

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

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

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

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

<xsd:attribute name="color" type="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>

たけち: この例では「グローバル属性宣言」を使っているけれど、これに対応するXMLデータは、次のようになって、colorには名前空間接頭辞は付かないよね。

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

さらら: あっ、そうね。名前空間接頭辞がついてないから、グローバル属性とは言えないのね。


■ローカル属性宣言を使って、グローバル属性を宣言: form="qualified"

たけち: これとは逆に、「ローカル属性宣言」を使いながら、名前空間接頭辞がついた属性、つまりグローバル属性を宣言してしまう方法が存在するんだよ。

さらら: えっ??

たけち: 次のXML Schemaをみて。

XML Schema例: form="qualified"を使用
<?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" form="qualified"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

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

<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="color" type="mp:ColorType" form="qualified"/>
</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>

さらら: form="qualified"ってついているわ。これまで書いたことなかったわね。

たけち: うん。xsd:attributeform="qualified" と書くと、それはローカル属性宣言であっても、名前空間接頭辞がその宣言した属性に付くことになるんだ。「qualified」は「(名前空間接頭辞で)修飾された」という意味だと覚えておこうね。つまり、この機能を使えば、ローカルに宣言されて使われるような属性でさえも、名前空間接頭辞がついた属性、つまりグローバル属性になるんだね。

さらら: へぇ〜。でも、それって何に使うの?

たけち: あっ。。。(^ ^; もう一つの方法をみておこうね。

たけち

■ローカル属性宣言を使って、グローバル属性を宣言: attributeFormDefault="qualified"

XML Schema例: attributeFormDefault="qualified"を使用
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema attributeFormDefault="qualified"
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>

たけち: xsd:schema要素の
attributeFormDefault="qualified"
 という属性に注目してね。このattributeFormDefault属性はoptionalな属性で、省略された場合には
attributeFormDefault="unqualified"
 になるんだ。

さらら: そうなの。

たけち:  そうだね。これは属性宣言の、xsd:schema要素の属性で、attributeFormDefault="qualified" と書くと、その定義されているスキーマの全ての属性が名前空間接頭辞がついた属性、つまりグローバル属性になるんだね。

さらら: へぇ〜。

たけち: だから、先ほどのXML Schemaに適合するXMLデータは、以下のようになるんだ。

さらら

XMLデータ例: 万葉歌
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem mp: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>

たけち: このXMLデータでは、color属性はもちろん、pno属性まですべて、mp:colormp:pnoというふうに、名前空間接頭辞がついた属性になってしまうんだよ

さらら: こんな機能がどうしてあるのかしら?

たけち:  それは僕にもよくわからないんだよね。ただ、実際にこの機能を使わなければ綺麗に定義できないようなXMLの応用規格が存在するんだよ。以前も話をしたように、「要素と属性は比較的平等に扱われている」ということで、このattributeFormDefaultに相当するelementFormDefaultという機能が存在していて、これは比較的よく使われる欠かせない機能になっているんだ。逆に言うと、elementFormDefaultという機能が欠かせないもので、かつ要素と属性は比較的平等に扱われなければならないからこそ、attributeFormDefaultという機能も一応必要だったのかもしれないね。

さらら: う〜ん、何かだいたいわかったような、わからないような(^ ^;)

たけち: そうだね。(^ ^; 今回はこれでおしまいにするね。

さらら: あっ、ありがと。

次回は、xml接頭辞の付いたグローバル属性です...... (^ ^;

さらら

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