XML名前空間とは,複数のXML文書がマージされても同名の要素,属性の衝突を避けられるよう策定された仕様です。具体例を挙げて解説していきます。

◇XSLTスタイルシートの中でのXML名前空間の指定

 「第3回 XSLTの基礎を学習する」の中で,XSLTスタイルシートの作成方法を説明しました。XSLTスタイルシートは,それ自体が整形式XML文書です。もう1度「はてなダイアリー形式からJUGEM形式に変換するXSLTスタイルシート」を,名前空間を指定している整形式XML文書として見てみましょう。

例1:はてなダイアリー形式からJUGEM形式に変換するXSLTスタイルシート
行番号は解説の便宜上付けたもので,実際のコードには必要ありません

[画像のクリックで拡大表示]

 この中のstylesheet要素,output要素,template要素,for-each要素,value-of要素はXSLT1.0の仕様で定義された要素で,XSLT変換ツールはこれらの要素が出てくると,繰り返し処理,出力処理など,それぞれ決められた命令,処理を実行します。

 一方,blog要素,name要素,description要素,users要素,tittle要素などは,XSLT1.0の仕様で定義された要素ではありません。

 XSLT1.0で定められた要素は,「http://www.w3.org/1999/XSL/Transform」という名前空間URIに属さなければならないことが,XSLT1.0の仕様の中で決められています。名前空間URIは,XML名前空間を一意に識別するためのものです。

 例1のように,この名前空間URIの指定を行うことにより,stylesheet要素,output要素,template要素,for-each要素,value-of要素などがXSLTの要素であることが明示されます。たとえXSLT命令要素と同名の,XSLT命令ではない要素がXSLT文書内に記述されたとしても,名前空間が異なっていれば,XSLT変換ツールはXSLTの命令要素ではないことを正確に判断します。

 このように特定の意味を持つ要素,属性が,同名の異なる要素,属性と区別されるように,XML名前空間は要素や属性を一意に識別できる機能を提供します。

◇XML名前空間の指定方法

 上で述べたように,XML名前空間は名前空間URIで一意に識別されます。URIとはインターネット上の資源のありかを示す記述方式で,URLもURIの記述形式の一つです。自サイトのURLを名前空間URIとして使うと,他のドメイン名の名前空間との衝突が起こらないため,名前空間URIとして自サイトのURLが比較的よく用いられます。Webページとしては実在しないURLを,名前空間URIにすることもできます。

 名前空間URIは,「一意な名称」となるように比較的長い名前がつけられますが,名前空間に属させたいすべての要素に名前空間URIを一つひとつ指定すると煩わしいため,名前空間URIは,所属させたい要素自身またはその親要素内で1度だけ定義し,各要素との結びつきは,名前空間接頭辞で指定します(図1)。

図1●XML名前空間http://www.w3.org/1999/XSL/Transformをstylesheet要素,output要素に指定
図1●XML名前空間http://www.w3.org/1999/XSL/Transformをstylesheet要素,output要素に指定

 図1では「xsl」という名前空間接頭辞をつけて,属する名前空間を表わしています。名前空間接頭辞は単に各要素を結びつける役割を果たすだけの文字列ですので,任意の文字列が使用できます。XSLTの場合にも,名前空間接頭辞は「xsl」以外の名称を使用してもかまいません。

確認問題1
次のXML文書の中で,名前空間http://www.infoteria.com/jp/sampleに属している要素はどれでしょうか。

<product xmlns:sample="http://www.infoteria.com/jp/sample">
  <sample:name>pencilia</sample:name>
  <sample:price>2500</sample:price>
  <comment/>
</product>

(a) product,name,price,comment

(b) name,price,comment

(c) name,price

(d) comment

 正解は(c)です。product要素,comment要素には名前空間接頭辞が指定されていませんので,名前空間に属さない要素となります。

◇属性へのXML名前空間の指定

 要素だけでなく属性にもXML名前空間の指定が行えます。図2のように属性についても要素と同様に名前空間接頭辞で指定を行います。

図2●XML名前空間http://www.infoteria.com/jp/sampleをname属性,price属性に指定
図2●XML名前空間http://www.infoteria.com/jp/sampleをname属性,price属性に指定

◇デフォルトの名前空間

 ある要素の子孫要素がほとんどすべて同じXML名前空間に属するような場合には,デフォルトの名前空間の指定を行うと便利です。

 デフォルトの名前空間は,図3のように名前空間接頭辞を省略してxmlns="名前空間URI""と記述します。

図3●デフォルトの名前空間の指定
図3●デフォルトの名前空間の指定

 このように記述すると,デフォルトの名前空間を指定した要素およびその要素のすべての子孫要素に対して,デフォルトの名前空間が適用されます。ただし,属性に対してはデフォルトの名前空間は適用されません。

◇デフォルトの名前空間の有効範囲

 デフォルトの名前空間が指定されている要素の子孫要素の中に,異なるデフォルトの名前空間を指定すると,指定した要素およびその子孫要素には,異なるデフォルトの名前空間を適用させることができます(図4)。

図4●デフォルトの名前空間の有効範囲
図4●デフォルトの名前空間の有効範囲

◇デフォルトの名前空間の取り消し

 「xmlns=""」の指定を行うことにより,特定の要素およびその要素の子孫要素には,デフォルトの名前空間を適用しないようにすることもできます(図5)。

図5●デフォルトの名前空間の取り消し
図5●デフォルトの名前空間の取り消し

確認問題2
次のXML文書の中で,名前空間http://www.infoteria.com/jp/sampleに属する要素,属性をすべて記述している選択肢はどれでしょうか。

<productlist xmlns="http://www.infoteria.com/jp/sample" 
            xmlns:sample2="http://www.infoteria.com/jp/sample2">
 <sample2:product owner="TARO YAMADA" sample2:date="2007/10/05">
   <name>pencilia</name>
   <price>2500</price>
   <comment xmlns=""/>
 </sample2:product>
</productlist>

(a) name要素, price要素

(b) name要素, price要素, comment要素

(c) name要素, price要素,owner属性

(d) productlist要素, name要素, price要素

(e) productlist要素, name要素, price要素,owner属性

(f) productlist要素

 正解は(d)です。productlist要素, name要素, price要素にはデフォルトの名前空間が適用されますが,名前空間接頭辞を指定しているproduct要素,デフォルトの名前空間の取り消しを指定しているcomment要素にはデフォルトの名前空間は適用されません。また属性にはデフォルトの名前空間は適用されませんので,owner属性はどの名前空間にも属さない属性となります。

 以上で「XMLマスター:ベーシック 実力養成講座」は修了となります。最後まで読破いただきまして,ありがとうございました。

 試験対策もさることながら,XML関連技術の利用目的や適用理由などもきちんとご理解いただけるよう,連載では「はてな」のXML文書を題材に,1つのストーリーの中で「XMLマスター:ベーシック」試験出題技術を一通り解説してきましたが,いかがでしたでしょうか。この連載が皆様の「XMLマスター:ベーシック」試験合格に,また今後の実務の中でお役に立てることを祈願しています。


野中 康弘
インフォテリア 教育部 エンジニア。十数年間システム開発に携わり,そのうちの半分をデータベース管理者として奮闘する。現在は,インフォテリア認定教育センターのサポートや,XML技術者認定制度の「XMLマスター」に対応したコーステキストの開発などを担当している。