初稿: 2005-09-02
XML名前空間は、複数のサブセットを1つの文書で使用するために考え出されました。例えば、bookshelfサブセットのtitle要素は「bookshelf:title」のように、cdboxサブセットのtitle要素は「cdbox:title」のように、接頭辞を付けてそれぞれを区別します。そもそもコンピュータ用語で「名前空間」とは、クラス、関数や変数などの「物」の名前の重複を避けるために、分けられた空間を意味します。つまり同じ空間内では同じ名前を使用できませんが、空間が違えば同じ名前を使用できます。XMLの名前空間も同様でサブセットごとに空間を分けることにより、他のサブセットと要素名や属性名がぶつからないようになっています。今回はXML名前空間と要素、属性の関わりについて考えます。
要素と属性はXMLの主要な構成物ですが、XML名前空間の仕様から要素、属性を3つに分類できます。下記のbookshelfサブセットを例に見てみましょう。
<?xml version="1.0"?>
<bs:bookshelf xmlns:bs="http://www.yt3.info/bookshelf">
<bs:book bs:jan="0000000000017" issue="第2版">
<bs:title>はじめてのXML</bs:title>
<bs:author>桃 太郎</bs:author>
</bs:book>
<bs:magazine bs:jan="0000000000024" issue="2005年8月号">
<bs:title>月刊XML</bs:title>
<bs:publisher>日本出版社</bs:publisher>
</bs:book>
</bs:bookshelf>
「bs:」はbookshelfサブセットを表す接頭辞で、「bs:bookshelf」要素や「bs:book」要素のように全ての要素に対して適用されます。全ての要素はサブセット全体に対して定義されるので、1つのサブセット定義の中で同名の要素を複数定義することはできません。
属性には接頭辞が付くものとそうでないものがあります。このうち「bs:jan」属性のように接頭辞が付く属性は、サブセット全体に対して定義されるので、1つのサブセット定義の中で同名の属性を複数定義することはできません。また全体に及ぶ属性なので、全ての要素に対して属すことができます。
「issue」属性のように接頭辞が付かない属性は、それぞれの要素に対して定義されるので、1つの要素の中で同名の属性を複数定義することはできませんが、要素が違えば同名の属性を定義することができます。また要素固有の属性なので、その要素に対してしか属すことはできません。
3つの要素、属性はそれぞれ独立しているので、分類が違えば同じ名前を定義できます。例えば、「bs:title」要素と接頭辞が付く「bs:title」属性と付かない「title」属性を同時に定義できます。
XML名前空間は複数のサブセットを1つの文書で使用するための仕組みなので、あるサブセットの中に別のサブセットを組み込むことができます。では前節のbookshelfサブセットが別のcdboxサブセットの中に組み込まれた例を見てみましょう。
<?xml version="1.0"?>
<cb:cdbox xmlns:cb="http://www.yt3.info/cdbox" xmlns:bs="http://www.yt3.info/bookshelf">
<cb:cd bs:jan="0000000000031" release="2005-07-21">
<cd:title>New Jazz Sounds</cd:title>
<cd:artist>東京ピアノトリオ</cd:artist>
</cb:cd>
<bs:book bs:jan="0000000000017" issue="第2版">
<bs:title>はじめてのXML</bs:title>
<bs:author>桃 太郎</bs:author>
</bs:book>
</bs:cdbox>
補足: 強調した箇所はbookshelfサブセットに属す部分
「bs:book」要素がcdboxサブセットに組み込まれていますが、このように全ての要素は別のサブセットに組み込むことができます。次に「bs:jan」属性にように接頭辞が付く要素は、特定の要素固有のものではないので、別のサブセットの要素にも属すことができます。逆に「issue」属性のような接頭辞が付かない属性は要素固有のものなので、単独で他のサブセットに組み込むことはできません。このように他のサブセットに組み込む場合、要素、属性の分類によってその制限が変わってきます。
XML名前空間の仕組みはXMLの仕様には含まれておらず、後からXMLの仕様とは別にXML名前空間の仕様が追加されました。そのため、XML標準のスキーマ文法であるDTDはXML名前空間に対応していないため、対応するスキーマ言語の策定が望まれました。そしてXML SchemaはXML名前空間に対応したXML標準のスキーマ言語の候補として策定されました。XML Schemaでの要素、属性の分類は、XML名前空間の仕様に対し拡張されています。これを踏まえたbookshelfサブセットを例にXML Schemaで分類される要素、属性を見てみましょう。
<?xml version="1.0"?>
<bs:bookshelf xmlns:bs="http://www.yt3.info/bookshelf">
<bs:book bs:jan="0000000000017" issue="第2版">
<title>はじめてのXML<title>
<author>桃 太郎<author>
</bs:book>
<bs:magazine bs:jan="0000000000024" issue="2005年8月号">
<title>月刊XML<title>
<publisher>日本出版社<publisher>
</bs:book>
</bs:bookshelf>
補足: 強調した箇所は新しい分類となるローカル要素
XML名前空間の仕様での「全ての要素」と同等のものです。
「title」要素や「author」要素のように、接頭辞が付かない要素が新たに追加されました。ローカル要素はそれぞれのグローバル要素に対して定義されるので、1つのグローバル要素の中で同名のローカル要素を複数定義することはできませんが、グローバル要素が違えば同名のローカル要素を定義することができます。またグローバル要素固有の要素なので、そのグローバル要素に対してしか属すことはできません。
XML名前空間の仕様での「接頭辞が付く属性」と同等のものです。
XML名前空間の仕様での「接頭辞が付かない属性」と同等のものです。
大きな違いとして、接頭辞が付かない要素であるローカル要素が追加されていますが、実際には構造が複雑になってしまうため、ローカル要素は使われていないのが現状です。また、スキーマ言語には他にRELAX NGも存在する点からも、XML Schema独自のローカル要素は使わない方がよいでしょう。