xml接頭辞の付いたグローバル属性-2

2003年4月27日(日)更新


■xml接頭辞の付いたグローバル属性の書き方

たけち: 前回お話した、xmlという接頭辞が付く名前空間のグローバル属性の、xml:lang, xml:space, xml:baseの3つについてだけどね。

さらら: えぇ。

たけち: DTDでは、例えばpoemという要素に組み込むのだったら、
<!ATTLIST poem xml:space (default|preserve) "preserve">
 と書きなさいとか、
<!ATTLIST poem xml:lang NMTOKEN #IMPLIED>

<!ATTLIST poem xml:lang NMTOKEN "en">
 と書きなさいとかいうことが、Extensible Markup Language (XML) 1.0では決められているんだよね。

さらら: ふぅ〜ん。。。自分で書かないといけないのに、いちいちここまで書き方を指示されるって、なんかちょっと、ね (^ ^;

たけち: そうだね(^^;) こんなことをしないといけないのは、DTDでは特定の要素に属さない属性を宣言する方法がなくて、ライブラリ化できないからなんだ。それに対してXML Schemaでは、先にも学んだようにグローバル属性宣言を使って、このようなグローバル属性を宣言できるようになっているんだよ。

さらら: あっ、そうなのね。

たけち: http://www.w3.org/2001/xml.xsdというXML Schemaのファイルに、これらのグローバル属性が宣言されているんだ。このファイルがどういう書き方になっているか見てみようね。簡単のために、注釈の部分をカットしておくね。(注釈については別途学びます。)

たけち

■http://www.w3.org/2001/xml.xsd

XML Schema: xml
<?xml version='1.0'?>
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN"
    "XMLSchema.dtd" >
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
        xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">

    <xs:attribute name="lang" type="xs:language" />

    <xs:attribute name="space" default="preserve">
        <xs:simpleType>
            <xs:restriction base="xs:NCName">
                <xs:enumeration value="default"/>
                <xs:enumeration value="preserve"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>

    <xs:attribute name="base" type="xs:anyURI" />

    <xs:attributeGroup name="specialAttrs">
        <xs:attribute ref="xml:base"/>
        <xs:attribute ref="xml:lang"/>
        <xs:attribute ref="xml:space"/>
    </xs:attributeGroup>


</xs:schema>

たけち: ここではXML Schemaの名前空間接頭辞としてxsdではなくてxsが使われているけれど、単に接頭辞が変わっただけのことだから、これは気にしないでね。

さらら: えぇ。で、lang, space, baseの三つのグローバル属性宣言があるのね。。。。それに、specialAttrsという名前の名前付き属性グループ定義があるわ。

たけち: そうだね。これはこの3つをセットで使いたい場合のことも考えて、こういったものも提供されているんだよ。

さらら: なるほど。。。でも、xs:schema要素に、これから定義したいxml:langがあるなんて、なんか変だわ。

たけち: そう言われればそうかもしれないね(^ ^;) まずは、この場所にxml:langを使っていいということが、XML Schema自身のXML SchemaやDTDで決められているんだね。そして、XML Schema自身のXML Schemaは、この
http://www.w3.org/2001/xml.xsd
 を参照している、ということだね。

さらら: う〜ん・・・

たけち: そしてそのxml.xsdはXML Schemaで書かれているから、ここにxml:langが使われていても不思議じゃないね。何か堂々巡り的で不思議だね(^ ^;) でもまあ、
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
 と書かれているから、XML Schema自身のDTDであるXMLSchema.dtdで、この場所のxml:langの使用が決められていると言ってもいいかもしれないけどね(^ ^;)

たけち

さらら: XML Schema自身のXML Schema? XML Schema自身のDTD?

たけち: そう、XML Schema自身がXMLなんだから、当然、それはXML Schema自体で定義できるし、DTDでも定義できる。まあXML Schema自身のXML Schemaこそ堂々巡りだけれどね(^ ^;)

さらら: 不思議。


■http://www.w3.org/2001/xml.xsdをimport

たけち: さて、その話はさておいて、こんなふうにxml接頭辞の付いたグローバル属性は、http://www.w3.org/2001/xml.xsdというスキーマファイルで定義されているんだよ。ということは、これらのグローバル属性を使おうと思ったら、このスキーマファイルをimportすればいいわけだね。

さらら: なるほど。。

たけち: じゃあ、試しに次のXMLデータのXML Schemaを作ってみよう。

XMLデータ例: 万葉歌(英訳付き)
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem pno="4088" xml:lang="ja" xml:base="http://www.example.com/manyou/"      xmlns:mp="http://www.yuragi.jp/ns/manyouPoem">
<mp:img src="yuri4088.jpg" />
<mp:poet>
大伴家持</mp:poet>
<mp:yomi xml:space="preserve">
さ百合花         ゆりも逢はむと             思へこそ     今のまさかも         うるはしみすれ </mp:yomi>
<mp:yaku>
百合の花、また後にもお会いしたいと思うからこそ、今この時も、誠実に親しくするのですよ</mp:yaku>
<mp:yaku xml:lang="en">
I receive you warmingly with lovely lily, 'cause I hope we'll meet again</mp:yaku>
</mp:poem>

たけち: まず、mp:poem要素にxml:base属性とxml:lang属性が使えるようにし、mp:yomi要素にはxml:space属性、そしてmp:yaku要素にxml:lang属性が使えるようなスキーマを作ってみることにするね。

XML Schema例: xml:lang, xml:space, xml:base属性を使用
<?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:import namespace="http://www.w3.org/XML/1998/namespace"
     schemaLocation="http://www.w3.org/2001/xml.xsd"/>


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

<xsd:complexType name="PoemType">
<xsd:sequence>
<xsd:element ref="mp:img" />
<xsd:element ref="mp:poet" />
<xsd:element ref="mp:yomi" />
<xsd:element ref="mp:yaku" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" />
<xsd:attribute ref="xml:lang" />
<xsd:attribute ref="xml:base" />

</xsd:complexType>

<xsd:element name="img" type="mp:ImgType" />
<xsd:element name="poet" type="xsd:string" />
<xsd:element name="yomi" type="mp:YomiType" />
<xsd:element name="yaku" type="mp:YakuType" />

<xsd:complexType name="ImgType">
<xsd:attribute name="src" type="xsd:anyURI" />
</xsd:complexType>

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

<xsd:complexType name="YakuType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="xml:lang" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

</xsd:schema>

たけち: これを見てもわかるように、xml名前空間接頭辞が付くグローバル属性といっても、名前空間宣言が省略されている以外は、他の一般的なグローバル属性と扱いは違わないね。ちゃんと、
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"
     schemaLocation="http://www.w3.org/2001/xml.xsd"/>

 とimportも書かないといけないわけだしね。

さらら: なるほどね。

たけち

■名前つき属性グループ定義を使用した例

たけち: せっかくxml.xsdには、specialAttrsという名前の名前つき属性グループ定義が用意されているので、これを使って全要素が、3つすべてのxml名前空間接頭辞が付くグローバル属性を使えるスキーマにしてしまうような場合も見ておこうね。

XML Schema例: xml:lang, xml:space, xml:base属性を使用
<?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:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>

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

<xsd:complexType name="PoemType">
<xsd:sequence>
<xsd:element ref="mp:img" />
<xsd:element ref="mp:poet" />
<xsd:element ref="mp:yomi" />
<xsd:element ref="mp:yaku" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" />
<xsd:attributeGroup ref="xml:specialAttrs" />
</xsd:complexType>

<xsd:element name="img" type="mp:ImgType" />
<xsd:element name="poet" type="mp:PoetType" />
<xsd:element name="yomi" type="mp:YomiType" />
<xsd:element name="yaku" type="mp:YakuType" />

<xsd:complexType name="ImgType">
<xsd:attribute name="src" type="xsd:anyURI" />
<xsd:attributeGroup ref="xml:specialAttrs" />
</xsd:complexType>

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

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

<xsd:complexType name="YakuType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attributeGroup ref="xml:specialAttrs" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

</xsd:schema>

たけち: こういうふうにすると、全ての要素で3つすべてのxml名前空間接頭辞が付くグローバル属性が使えるようになるんだね。

さらら: えぇ、わかったわ(^ ^)

たけち: よかった。(^ ^; 今回はこれでおしまいにするね。

さらら: うん。ありがと。

さらら

次回は、xsi:schemaLocationとxsi:noNamespaceSchemaLocation - 1です...... (^ ^;


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