|
XML Schema達人への道
基礎4:名前空間とXML Schema-その2
2002年9月11日更新
(株)日本ユニテック
奥井 康弘
<この記事はDigital
Xpress 2001 Vol.8(4-5月号)に掲載されたものです>
前回、名前空間にXML Schemaがどのように対応しているかの説明を行いました。今回はその続きとして、まず、名前空間に属さない要素や属性について解説します。そして、その後、名前空間接頭辞の付け方についてグローバル/ローカルな要素や属性というXML
Schemaの新しい考え方について説明します。
<<前ページ「グローバルな属性とローカルな属性」
XMLインスタンス全体で有効な指定
XMLインスタンス全体でローカル要素にも名前空間接頭辞を割り当てる場合には、xsd:schemaのelementFormDefault属性で"qualified"とします。
elementFormDefault属性を"unqualified"とするとローカル要素には名前空間接頭辞を付けません。通常ローカル要素には名前空間接頭辞を付けませんので、"unqualified"がデフォルト指定となっています。
属性についても同様です。xsd:schemaのattributeFormDefault属性を"qualified"と指定するとXMLインスタンス全体でローカル属性にも名前空間接頭辞を付け、"unqualified"とするとローカル属性には名前空間接頭辞を付けません。"unqualified"がデフォルト指定です。
XMLインスタンス全体でローカル要素、ローカル属性に名前空間接頭辞を割り当てる書き方:
<xsd:schema elementFormDefault="qualified">
<xsd:schema attributeFormDefault="qualified">
※ デフォルトは"unqualified" |
さきほどのスキーマ文書booksales.xsdで、xsd:schemaのelementFormDefault属性を"qualified"にするとXMLデータは次のようになります。
【スキーマ文書-booksales.xsd】
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.utj.co.jp/namespaces/memo"
targetNamespace="http://www.utj.co.jp/namespaces/booksales"
elementFormDefault="qualified">
<xsd:element name="booksales">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="book"/>
<xsd:element ref="sold-to"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="book">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"
/>
<xsd:element name="price" type="xsd:string"
/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="sold-to">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="first" type="xsd:string"
/>
<xsd:element name="last" type="xsd:string"
/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
|
【XMLデータ】
<?xml version="1.0"?>
<bs:booksales
xmlns:bs="http://www.utj.co.jp/nameapaces/notice/booksales"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.utj.co.jp/namespaces/booksales
booksales.xsd">
<bs:book>
<bs:name>XML Schema完全解説</bs:name>
</bs:book>
<bs:sold-to>
<bs:name>
<bs:first>太郎</bs:first>
<bs:last>山田</bs:last>
</bs:name>
</bs:sold-to>
</bs:booksales> |
個別の要素や属性に対する指定
elementFormDefault属性とattributeFormDefault属性は、XMLインスタンス全体でローカル要素とローカル属性に名前空間接頭辞を割り当てるものです。これに対し、個々のローカル要素やローカル属性に対して名前空間接頭辞を割り当てることもできます。これを行うのが、要素宣言と属性宣言のform属性です。値は"qualified"と"unqualified"であり、"qualified"なら名前空間接頭辞を付け、"unqualified"なら名前空間接頭辞を付けません。
個別のローカルな要素と属性へ名前空間接頭辞の割り当てるための指定:
<xsd:element name="要素名" form="qualified"
>
<xsd:attribute name="属性名" form="qualified"
>
|
グローバル属性という呼び方の2つの意味
グローバル属性と聞くと、「どんな要素に付けてもよい属性」というものを想像することでしょう。実際、XML自体は、そのようなものがあってもよいということになっています。ただし気をつけなければならないのは、XML
Schemaのスキーマ文書で宣言される属性はグローバル属性であっても、それを使用する位置は定まっているということです。さきほどのグローバル属性 id もbookとCDの要素の宣言内で、xsd:attributeを使って、そのグローバル属性の利用を宣言していました。
でも、XML Schemaを使ったXMLデータにも「どこにでも使える」属性が出現することもあります。スキーマ文書の位置を特定するxsi:schemaLocationやxsi:noNamespaceSchemaLocationの属性はどの要素にでも指定することができます。これらは、"http://www.w3.org/2001/XMLSchema-instance"という名前空間に属する特別な属性です。この他、この名前空間にはxsi:type、.xsi:ni lという属性があります。これらについては、「標準XML完全解説 下巻」(技術評論社)などの参考書をご覧下さい。
要素をグローバルとローカルで区別するのは実用的か?
さて、ここまでで、グローバル要素/属性、ローカル要素/属性について説明してきました。これは、考え方としては面白いものです。しかし、XMLデータを書くときには、名前空間接頭辞を付ける/付けないの問題があることは今回説明したとおりです。スキーマ文書を読まなければタグ付けができないというのは、人間がXMLデータを書くときには大きな障害となります。
それを解決するために、ローカル要素にも接頭辞を付けさせる指定もXML Schemaでは用意しましたが、これは、逆にXMLデータを見ても、スキーマの意図(グローバルかローカルか)が分からないという逆の問題を生じさせます。
属性については、id属性の例でも分かるように、使い道はありそうです。しかし、要素については、グローバル/ローカルという考え方は実用的だとは思えません。DTDと同様、すべての要素はグローバル要素として宣言する。これが、XML
Schemaを混乱なく使うポイントだということになるでしょう。
次回は、XML Schemaの最終回として、スキーマ文書をカスタマイズするときに必要な機能やその他の機能について説明します。
>>次の記事「XML Schemaのカスタマイズ」
関連サービス
XMLスキーマの策定、作成業務
関連キーワード: XMLスキーマ
関連キーワード: 名前空間

|