XML名前空間に関して要素、属性を分類する

初稿: 2005-09-02

そもそも名前空間とは?

XML名前空間は、複数のサブセットを1つの文書で使用するために考え出されました。例えば、bookshelfサブセットのtitle要素は「bookshelf:title」のように、cdboxサブセットのtitle要素は「cdbox:title」のように、接頭辞を付けてそれぞれを区別します。そもそもコンピュータ用語で「名前空間」とは、クラス、関数や変数などの「物」の名前の重複を避けるために、分けられた空間を意味します。つまり同じ空間内では同じ名前を使用できませんが、空間が違えば同じ名前を使用できます。XMLの名前空間も同様でサブセットごとに空間を分けることにより、他のサブセットと要素名や属性名がぶつからないようになっています。今回はXML名前空間と要素、属性の関わりについて考えます。

要素、属性は3つに分類される

要素と属性は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>

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 Schemaでは拡張されている

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>

補足: 強調した箇所は新しい分類となるローカル要素

大きな違いとして、接頭辞が付かない要素であるローカル要素が追加されていますが、実際には構造が複雑になってしまうため、ローカル要素は使われていないのが現状です。また、スキーマ言語には他にRELAX NGも存在する点からも、XML Schema独自のローカル要素は使わない方がよいでしょう。


目次へ戻る