XMLと相対参照

XMLと相対参照

[18] 相対URIとその基底URIの取り方にも色々と問題があります。 大きく、

辺りに集約できるでしょう。

基底 URI の存在

[25] XML では、次のものに構造的に基底 URI が存在します。

文書実体
文書実体そのものを取得するのに使った URI
(外部解析実体)
実体が参照された時その実体とまわりとの境界は失われるので、実質的には基底 URI を持てない。
要素
xml:base 属性の値又は親構造から継承
外部解析実体内の外部識別子を持つマーク宣言
外部解析実体の基底 URI

基底 URI の決定

文書実体を含む外部解析実体の基底 URI

[26] (参照: <http://www.w3.org/TR/xmlbase/#granularity>)

  1. カプセル化している実体 (ここで実体とは、 MIME 的な意味。) の基底 URI。
  2. 実体を取り出すのに使用した URI。
    • HTTP の redirect などが使われた場合は、 最終的に使用した URI。
  3. 応用文脈で決定する URI。

要素の基底 URI

[27] (参照: <http://www.w3.org/TR/xmlbase/#granularity>)

  1. その要素の xml:base 属性の値による URI。
  2. その要素が外部解析実体に直接に含まれる (例: <?xml encoding="iso-2022-jp"?>なんたら<whatIsBase>The Element</whatIsBase>かんたら) なら、その実体の基底 URI (>>26)。
  3. そうでないなら、その要素の親要素の基底 URI (>>27)。

  • [29] なお、 xml:base 属性の値が相対 URI であることもあり得ます。この値は更に上位の情報を元に (要素自体の兄弟としてその相対 URI が存在したかのような感じで) 解決されます。

その他の基底 URI

[28] 属性, 文字, 実体 (の置換文) は基底 URI を持ちません。それを含む・参照する構造の基底 URI が使われます。

例えば、

<!ENTITY ent "relative/URI">
<!ENTITY ext SYSTEM "entities/ext.ent">
 ...
<element xml:base="http://example/base/URI/of/element">
  <el attribute="relative/URI"/>
  <uri>relative/URI</uri>
  &ent;
  &ext;
</element>
 
 entities/ext.ent
relative/URI
<uri>relative/URI/2</uri>

で、 relative/URI はすべて http://example/base/URI/of/relative/URI, relative/URI/2http://example/base/URI/of/entities/relative/URI に解決されます。

まとめ

[30] 以上の説明と重複ではありますが、 <http://www.w3.org/TR/xmlbase/#matching> から:

  • 文内容にある URI 参照の基底 URI は、その文が含まれる要素の基底 URI とする。
  • xml:base 属性の中にある URI 参照の基底 URI は、
    • その要素のその文書実体又は外部解析実体中にある親要素で xml:base 属性を持っている香具師がいれば、その基底 URI とし,
    • そうでなければ、その要素を含んでいる文書実体又は外部解析実体の基底 URI とする。
  • これ以外の属性の値 (既定属性値を含む。) にある URI 参照の基底 URI は、その属性を持っている要素の基底 URI とする。
  • 処理指令の内容にある URI 参照の基底 URI は、
    • その処理指令の親要素がその文書実体又は外部解析実体中にあれば、その基底 URI とし,
    • そうでなければその処理指令を含む文書実体又は外部解析実体の基底 URI とする。
  • [31] で、結局 XML 基底の仕様書には DTD 中の構造の基底 URI についての言及はないんですけど、その辺は >>1- に書いてある、システム識別子の基底 URI の計算方法と同じと見ていいんでしょうかね? まあ同じじゃないと困るんですが。

システム識別子の基底 URI について

[9] システム識別子参照。

XML 名前空間における名前空間名と相対 URI

[19] XML名前空間ではその名前空間を識別する名前空間名として URI 参照を用いますが、最初の勧告ではその同一性の定義 [同一] にて、相対 URI を使うと基底 URI との絡みで面倒なことになるのが示唆されています。

この問題についての討論会 [xppa] が行われ、結果として相対 URI の使用は非推奨とし、その解決は将来の W3C の仕様書で規定するかもしれないとされました [修正4]。

その後、更に修正が加えられ、相対 URI の意味については将来の W3C 仕様書でも規定しないことになりました [修正9]。

DOMXPath などの XML 名前空間を扱う関連仕様でも、 その挙動は未定義となっています。 XMLBasexml:base 属性の名前空間名に対する効力は未定義にしています。

[20] 空の URI (長さ 0 の文字列) は一般には基底 URI そのものを指しますが、これが使えるかははっきりしません。

既定名前空間の定義 [既定 NS] には、 既定名前空間の宣言では空の文字列が指定 (xmlns="") できると書かれています。 但しこの場合は URI 参照としてではなく、 「名前空間なし」の指定とみなされます。

既定名前空間の宣言では、と書かれていることから推測して、 既定名前空間以外の宣言では使用できないと解釈できるかもしれませんが、 現時点で勧告にも Errata にもなんとも書いてありません。 ただ、 [修正 9] には「 The use of relative URI references, including same-document references, in namespace declarations is deprecated.」 と書かれています (強調引用者)。 [修正 4] にはなかった注記がわざわざ加えられているのですから、 使えると考えられるかもしれません。 (でも同じ文書の参照には # というのもあります...)]]

[21] XML 名前空間 1.1 では空の属性値の宣言だとその接頭辞についての関連付けを取り消すという意味に解釈されることになっています。 [修正 9] の修正はこの「非互換性」への配慮かもしれませんが...

[22] ちなみに、 Mozilla の XML parser は xmlns:ns="" を文句なしに解釈してくれますが、 M$XML致命的誤りと解釈しています。

[23] 名前空間 1.1 では IRI を URI の代わりに使いますが、 そこ [1.1 IRI] で「空文字列も妥当な IRI 参照であるが、 XML 名前空間では使わない」と言っています。 これは 1.0 にはない文ですが、これから推測するとやはり 1.0 で空文字列 URI 参照は妥当なのかもしれません。

[24] ところで、 XML 名前空間 1.1 でも、「将来の仕様書でも解釈は規定しない」 としながらも相対 IRI を認めています。 なんで禁止しないんでしょう? >>23 が真であるなら 1.0 と 1.1 は非互換なので、これも禁止しちゃえばいいのに。 それともやっぱり互換性を保つ必要があるから禁止はしないのかなあ。 やっぱりわからん...

[35] RDFa は、名前空間URL相対URL であるのは相応しくないものの、 RDFa 処理モデルでは必ず基底URL に対して解決するので問題にはならない、 としています。

メモ