外部参照されたDTD内でさらに外部のXMLファイルを参照する場合

ページ情報
制作日
2003-12-26
最終更新日
2003-12-26
参照用URI
http://www.arielworks.net/articles/2003/1226d
分野

問題:基準となるURIはどこになるでしょう

上のようなディレクトリ構成で(hoge.xmlはルートと「bar」ディレクトリにそれぞれある)foo.xmlはbaz.dtdをDOCTYPE宣言で外部参照参照している。また、foo.xml内には実体参照&ent;が含まれる。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test SYSTEM "./bar/baz.dtd">

<test>
&ent;
</test>

baz.dtd内には&ent;に関して実体参照宣言が書かれている。置換される実体はbaz.dtdからみてさらに外部になるhoge.xmlとする。

<!ENTITY ent SYSTEM "hoge.xml">

さて、このように書いた場合、参照されるのはルートにあるhoge.xmlでしょうか、それとも「bar」ディレクトリにあるhoge.xmlでしょうか。便宜的にルートのhoge.xmlを1、「bar」ディレクトリのhoge.xmlを2とします。

それぞれの回答

PHP4.3.4のXSLT関数の場合

xslt_set_base()関数などで予め設定していない限り、PHP4.3.4のxslt関数は2番のhoge.xmlを読みに行きます。

IE6の場合

1番のhoge.xmlを読みに行きます。

Mozilla1.6bの場合

無視されます。実体参照が無い、といわれてアウトです。

どうすればいいんだ

Mozillaははなから外部参照を無視するそうなので仕方がないとして、IE6とPHP4.3.4の動作の違いはどちらが正しいのでしょうか。試しにXHTML1.1のDTDを見てみると各モジュールを絶対URIで読み込んでいました。

Googleで検索しまくったところ同じ事に言及しているページが見つかりました。

Unless otherwise provided by information outside the scope of this specification (e.g. a special XML element type defined by a particular DTD, or a processing instruction defined by a particular application specification), relative URIs are relative to the location of the resource within which the entity declaration occurs.

Extensible Markup Language (XML) 1.0 (Second Edition)(W3C)』より引用。

XML1.0の勧告のちょうどこの部分を根拠に1番のhoge.xmlを読みに行くのが正しいようです。つまりPHP4.3.4の動作が正しいということです。

どうやら実際にはパーサによって実装が違う部分があるようなので外部参照をするときは出来るだけ絶対URIで指定するのが安全なようです。

連絡先、リンク、転載や複製などについては「サイト案内」をご覧ください。Powered by HIMMEL