
[18] [[相対URI]]とその[[基底URI]]の取り方にも色々と問題があります。
大きく、
- 何を基準に基底 URI を設定するか
- 基底 URI が得られない時 [WEAK[(URI のない空間上の情報を扱う時や、階層のない URI 空間の資源を扱う時など)]] どうするか
- 識別子としての URI で相対 URI を認めるか

辺りに集約できるでしょう。



[[#comment]]


* 基底 URI の存在

[25] [[XML]] では、次のものに構造的に基底 URI
が存在します。
:[[文書実体]]:文書実体そのものを取得するのに使った URI
:([[外部解析実体]]):[WEAK[実体が参照された時その実体とまわりとの境界は失われるので、実質的には基底 URI を持てない。]]
:[[要素]]:[CODE(XML)[xml:base]] 属性の値又は親構造から継承
:外部解析実体内の[[外部識別子]]を持つ[[マーク宣言]]:外部解析実体の基底 URI

[[#comment]]


* 基底 URI の決定


** 文書実体を含む外部解析実体の基底 URI

[26] (参照: <http://www.w3.org/TR/xmlbase/#granularity>)
= カプセル化している実体 [WEAK[(ここで[DFN[実体]]とは、 [[MIME]] 的な意味。)]] の基底 URI。
-- 例えば MIME/[[HTTP]] の [CODE(MIME)[[[Content-Location:]]]]
欄とか。
= 実体を取り出すのに使用した URI。
-- HTTP の [[redirect]] などが使われた場合は、
最終的に使用した URI。
= [[応用]]の[[文脈]]で決定する URI。

[[#comment]]


** 要素の基底 URI

[27] (参照: <http://www.w3.org/TR/xmlbase/#granularity>)
= その要素の [CODE(XML)[xml:base]] 属性の値による URI。
= その要素が外部解析実体に直接に含まれる 
[WEAK[(例: [SAMP(XML)[<?xml encoding="iso-2022-jp"?>なんたら<whatIsBase>The Element</whatIsBase>かんたら]])]]
なら、その実体の基底 URI (>>26)。
= そうでないなら、その要素の親要素の基底 URI (>>27)。

- [29] なお、 [CODE(XML)[xml:base]] 属性の値が相対 URI であることもあり得ます。この値は更に上位の情報を元に [WEAK[(要素自体の兄弟としてその相対 URI が存在したかのような感じで)]] 解決されます。
[[#comment]]


** その他の基底 URI

[28] [[属性]], [[文字]], 実体 (の置換文) は基底 URI
を持ちません。それを含む・参照する構造の基底 URI
が使われます。

例えば、
[PRE[
<!ENTITY ent "relative/URI">
<!ENTITY ext SYSTEM "entities/ext.ent">
 [INS[...]]
<element xml:base="http://example/base/URI/of/element">
  <el attribute="relative/URI"/>
  <uri>relative/URI</uri>
  &ent;
  &ext;
</element>
 
 [INS[entities/ext.ent]]
relative/URI
<uri>relative/URI/2</uri>
]PRE]

で、 [CODE(URI)[relative/URI]] はすべて
[CODE(URI)[http://example/base/URI/of/relative/URI]],
[CODE(URI)[relative/URI/2]] は
[CODE(URI)[http://example/base/URI/of/entities/relative/URI]]
に解決されます。

[[#comment]]


** まとめ

[30] 以上の説明と重複ではありますが、
<http://www.w3.org/TR/xmlbase/#matching> から:

- 文内容にある URI 参照の基底 URI は、その文が含まれる要素の基底 URI とする。
- [CODE(XML)[xml:base]] 属性の中にある URI 参照の基底 URI
は、
-- その要素のその文書実体又は外部解析実体中にある親要素で [CODE(XML)[xml:base]] 属性を持っている香具師がいれば、その基底 URI とし,
-- そうでなければ、その要素を含んでいる文書実体又は外部解析実体の基底 URI とする。
- これ以外の属性の値 (既定属性値を含む。) にある URI 
参照の基底 URI は、その属性を持っている要素の基底 URI とする。
- 処理指令の内容にある URI 参照の基底 URI は、
-- その処理指令の親要素がその文書実体又は外部解析実体中にあれば、その基底 URI とし,
-- そうでなければその処理指令を含む文書実体又は外部解析実体の基底 URI とする。

- [31] で、結局 XML 基底の仕様書には DTD 中の構造の基底 URI についての言及はないんですけど、その辺は >>1- に書いてある、システム識別子の基底 URI の計算方法と同じと見ていいんでしょうかね? まあ同じじゃないと困るんですが。
[[#comment]]


* システム識別子の基底 URI について

[9] [[システム識別子]]参照。

* XML 名前空間における名前空間名と相対 URI

[19] [[XML名前空間]]ではその名前空間を識別する[[名前空間名]]として
URI 参照を用いますが、最初の[[勧告]]ではその[[同一]]性の定義
[同一] にて、相対 URI を使うと基底 URI
との絡みで面倒なことになるのが示唆されています。

この問題についての討論会 [xppa] が行われ、結果として相対 URI
の使用は[[非推奨]]とし、その[[解決]]は将来の W3C
の仕様書で規定するかもしれないとされました [修正4]。

その後、更に修正が加えられ、相対 URI の意味については将来の
W3C 仕様書でも規定しないことになりました [修正9]。

[[DOM]] や [[XPath]] などの XML 名前空間を扱う関連仕様でも、
その挙動は未定義となっています。 [[XMLBase]]
も [CODE(XML)[[[xml]]:[[base]]]] 
属性の名前空間名に対する効力は未定義にしています。

[20] 空の URI (長さ 0 の文字列) は一般には基底 URI
そのものを指しますが、これが使えるかははっきりしません。

[[既定名前空間]]の定義 [既定 NS] には、
既定名前空間の宣言では空の文字列が指定
([CODE(XML)[[[xmlns]]=""]]) できると書かれています。
但しこの場合は URI 参照としてではなく、
「名前空間なし」の指定とみなされます。

既定名前空間の宣言では、と書かれていることから推測して、
既定名前空間以外の宣言では使用できないと解釈できるかもしれませんが、
現時点で勧告にも Errata にもなんとも書いてありません。
ただ、 [修正 9] には「 The use of relative URI references, including ''same-document references'', in namespace declarations is deprecated.」
と書かれています (強調引用者)。
[修正 4] にはなかった注記がわざわざ加えられているのですから、
使えると考えられるかもしれません。
[WEAK[(でも同じ文書の参照には [CODE(URI)[#]]]]
というのもあります...)]]

[21] XML 名前空間 1.1 では空の属性値の宣言だとその[[接頭辞]]についての関連付けを取り消すという意味に解釈されることになっています。
[修正 9] の修正はこの「非互換性」への配慮かもしれませんが...

[22] ちなみに、 [[Mozilla]] の XML parser
は [SAMP(XML)[xmlns:[VAR[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
は非互換なので、これも禁止しちゃえばいいのに。
それともやっぱり互換性を保つ必要があるから禁止はしないのかなあ。
やっぱりわからん...

- [同一] <http://www.w3.org/TR/REC-xml-names/#dt-identical>
- [既定 NS] <http://www.w3.org/TR/REC-xml-names/#dt-defaultNS>
- [xppa] ''W3C XML Plenary Ballot on URIs and Namespaces'' <http://www.w3.org/2000/09/xppa>
- [修正4] <http://www.w3.org/XML/xml-names-19990114-errata#NE09>
- [修正9] <http://www.w3.org/XML/xml-names-19990114-errata#NE09>
- [1.1 IRI] <http://www.w3.org/TR/xml-names11/#iri-use>

[35]
[[RDFa]] は、[[名前空間URL]] が[[相対URL]] であるのは相応しくないものの、
[[RDFa]] [[処理モデル]]では必ず[[基底URL]] に対して[[解決]]するので問題にはならない、
としています。

;; [CITE@en[RDFa in XHTML: Syntax and Processing]] ([TIME[2008-10-14 00:17:32 +09:00]] 版) <http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014/#s_convertingcurietouri>

* メモ