名前空間宣言をどのように書くか

冗長な接頭辞表記を省いた XML 名前空間の住み分けを拝見しました。

どちらかと言えばですが、個人的には、正しい書き方その二の書き方の方が好きだったりします。同じ名前空間に属する要素なのに場所によって接頭辞が付いたり付かなかったりというのは却ってややこしい気がしますし、完成形のように同じ名前空間に対して2つの名前空間宣言がルート要素にあるというのもいまいちスマートでないような。正しい書き方その二の書き方は、XSLTスタイルシートの例でもよく見かけるからというのもあり。

とは言えどちらの書き方でもXMLパーサはきちんと解釈してくれるはずなので、書き方は人それぞれということになりそうですが。

* * *

ところで、完成形プラスアルファのソースには問題があります。以下3点。

実体宣言について註釈。HTMLでもよく用いられる©等の実体参照は、DTDでは

<!ENTITY copy   "&#169;">

という風に宣言されます。これらは一般実体宣言と呼ばれ、ソース内で&copy;と書かれた場合には宣言内の"..."で囲まれた文字に置き換えられます(実際には数値169 (=0xA9)で参照されるUnicode文字 © に置き換えられる)。

一方、完成形プラスアルファのソースで用いられている宣言は以下。

<!ENTITY x SYSTEM "http://www.w3.org/1999/xhtml">

書き方の違いは SYSTEM が入っている点ですが、この場合だと外部解析対象一般実体というものになり、実体参照&x;が参照するのは"http://www.w3.org/1999/xhtml"というURI文字列ではなく、"http://www.w3.org/1999/xhtml"のURIで参照されるファイルの中身そのものということになってしまいます。なので、完成形プラスアルファの目的に沿うようにするには、

<!ENTITY x "http://www.w3.org/1999/xhtml">

とすることになるかと思います。

* * *

DTDを使用するのであればもう少しよさげなやり方がありまして、それは、DTD内の属性宣言で名前空間宣言の値を固定してしまうという方法です。例えば以下のような感じで。

<!ATTLIST i:note
  xmlns CDATA #FIXED 'http://orz.cc/info/person/item'
>

こうすると「i:note要素のxmlns属性(実際にはデフォルトの名前空間宣言)は"http://orz.cc/info/person/item"で固定!」ということになるので、名前空間宣言そのものを省略できることになります。

で、この方法はルート要素のdataにある名前空間宣言にも応用できるので、完成形プラスアルファのソースは以下の様に書けます。

<?xml version="1.0"?>
<!DOCTYPE data [
  <!ATTLIST data
    xmlns   CDATA #FIXED 'http://orz.cc/info/person/item'
    xmlns:i CDATA #FIXED 'http://orz.cc/info/person/item'
  >
  <!ATTLIST i:note
    xmlns   CDATA #FIXED 'http://www.w3.org/1999/xhtml'
  >
]>
<data>
  <item xml:id="_1">
    <name>布団</name>
    <age>四年三ヶ月</age>
    <i:note>
      <p>一人暮らしを始める際に、ホストがくれたもの。</p>
      <dl>
        <dt>シーツの色</dt>
        <dt>薄紫</dt>
      </dl>
    </i:note>
  </item>
  (…中略…)
</data>

DTDを外部ファイルにすれば、更にすっきりとしたソースになりそうです。妥当性検証を行う予定があるのなら一石二鳥というところ。ただしXMLパーサの中には外部DTDを読まないものもあったりする(Mozilla FirefoxのXMLパーサとか)ので、その辺りどうするかはXML文書の用途に則して検討する必要がありそうです。

* * *

留意点で名前空間を使うことの有用性が述べられており、その内容についてはその通りだとも思うのですが、パフォーマンスを考慮する場合には名前空間の使用を避けるのもひとつの選択であると思います。……というのは以前に以下の記事を読んでいたので。

* * *

一応申し添えておきますと、自分はXMLについてはまだ学び中の素人であり、実際にサイト製作などで活用した経験も殆ど無いです。おかしな点がありましたら指摘頂ければ幸いです。

完成形プラスアルファのソースのチェック、及び例示したソースの整形式well-formed検証には、Cygwin上のlibxml2に附属するツールxmllintを使用しました。