* [CODE(DOMa)@en[baseURI]]属性 (DOM) [3] [[DOM水準3]]で[CODE(DOMi)@en[[[Node]]]][[界面]]に追加された[[読取専用属性]][DFN[[CODE(DOMa)@en[baseURI]]]]は、 その[[節点]]の[[基底URI]]を表します。 [1] '''仕様書''' - [DOM 3] -- 中核 [CSECTION@en[1.3.4 Base URIs]] -- 中核 [CODE(DOMi)@en[[[Node]]]] [CODE(DOMa)@en[[[baseURI]]]] -- 中核 [CODE(DOMi)@en[[[Document]]]] [CODE(DOMa)@en[[[documentURI]]]] -- 中核 [CSECTION@en[Appendix C: Infoset Mapping]] [[#comment]] ** 属性値 *** XML DOMの場合 [2] [SRC[DOM3 中核]] = [[XML基底]]に従って計算し、得た[[絶対URI]]です。 ([Q[[[URI]]]]は[[DOM URI]]の意味か?) = 得られなかった場合は、 [CODE(DOM)@en[[[null]]]]とします。 [3] [[実体参照]]を保存している場合は良いのですが、 そうで無い場合は[[外部実体]]中の[[基底URI]]情報が失われてしまいます。 [14] [CODE(DOMi)@en[[[DocumentType]]]], [CODE(DOMi)@en[[[Comment]]]], [CODE(DOMi)@en[[[Entity]]]], [CODE(DOMi)@en[[[Notation]]]], [CODE(DOMi)@en[[[EntityReference]]]], [CODE(DOMi)@en[[[DocumentFragment]]]], [CODE(DOMi)@en[[[XPathNamespace]]]] [WEAK[([[DOM水準3]] [[XPath]] )]] に関しては、相当する規定が参照されている[[XML基底]]仕様書に含まれていないので、 どんな値になるべきなのかがよくわかりません。 それ以外の種類の[[節点]]も、[[XML基底]]と[[DOM]]の附属書の規定 (>>8-13) に矛盾か見られます。 [16] '''部分木''' [CODE(DOMi)@en[[[Document]]]][[節点]]から連なる主となる[[木]]に属さない[[節点]] [WEAK[(例えば、[CODE(DOMm)@en[[[createElementNS]]]]したばかりの[[節点]])]] は [WEAK[(そもそもそのようなものがない)]] [[XML仕様]]では[[基底URI]]が規定されていませんが、 [[DOM]]の仕様書でも規定されていません。 [[#comment]] *** W3C HTML DOMの場合 [4] [CODE(DOMi)@en[[[Document]]]]が[[機能]] [CODE(DOM)@en[[[HTML]]]] ([[DOM水準2]] [[HTML]]仕様が参照されています。) に対応している場合 [SRC[DOM3 中核]]: = [CODE(HTMLe)@en[[[base]]]][[要素]]の[CODE(HTMLa)@en[[[href]]]][[属性]]があれば、その値を使って計算します。 = 無い場合は、[CODE(DOM)@en[[CODE(DOMi)@en[[[Document]]]].[CODE(DOMa)@en[[[documentURI]]]]]]です。 [5] [CODE(DOMa)@en[[[documentURI]]]]は[CODE(DOMa)@en[[[baseURI]]]]とは違って読書両用です。 その定義には、設定時に字句的なチェックはしないので、 [CODE(DOMa)@en[[[baseURI]]]]が[CODE(DOM)@en[[[null]]]]になることもある [SRC[DOM3 中核]] とされています。 [[絶対URI]]''以外''が指定された場合は[CODE(DOMa)@en[[[documentURI]]]]から[CODE(DOMa)@en[[[baseURI]]]]を定められないという意味でしょうか。 よく読むと[CODE(DOMa)@en[[[documentURI]]]]の定義には、 [[属性名]]以外でその値が[[URI]]であるとは一言も述べられていません。 どうしろというのでしょうか。 [[#comment]] *** メモ [[#comment]] ** 関連 [6] '''[CODE(InfoProp)[基底URI]]''' [[合成情報集合]]では[CODE(InfoProp)[[[基底URI]]]]と[CODE(XMLa)@en[[[xml]]:[[base]]]]を計算して得られる値が一致するとは限りませんが、 [[DOM]]には[CODE(InfoProp)[[[基底URI]]]]に直接相当するものがなく、 常に[CODE(XMLa)@en[[[xml]]:[[base]]]]を計算するので、 情報の欠落なく[[DOM]]''外''から得られた[[合成情報集合]]を直接処理することはできません。 [8] [[DOM]]と[[情報集合]]の写像 [SRC[DOM3]] によれば、[[文書]][[情報項目]]と[CODE(DOMi)@en[[[Document]]]]では[CODE(InfoProp)[[[基底URI]]]]と[CODE(DOMa)@en[[[baseURI]]]]および[CODE(DOMa)@en[[[documentURI]]]]が対応することになっています。 [CODE(DOMa)@en[[[documentURI]]]] ([[文書]]の場所) に相当する情報が無い[[情報集合]]''から''[[DOM]]への変換で[CODE(DOMa)@en[[[documentURI]]]]に[CODE(InfoProp)[[[基底URI]]]]を使うのはよいとしても、 逆に[CODE(InfoProp)[[[基底URI]]]]を[CODE(DOMa)@en[[[baseURI]]]]から持ってくるのはおかしいです。 [[DOM]]の[CODE(DOMa)@en[[[baseURI]]]]の定義は[[XML基底]]により、 [[XML基底]]の定義は[[RFC 2396]]に拠っている''はず''ですから、 [[基底URI]]と[[文書]]の所在は必ずしも一致しない''はず''です。 ;; ''はず''というのは、[[XML基底]]の仕様書もなんだかおかしいからです。 [9] [[DOM]]と[[情報集合]]の写像 [SRC[DOM3]] によれば、[[要素]][[情報項目]]と[CODE(DOMi)@en[[[Element]]]]では[CODE(InfoProp)[[[基底URI]]]]と[CODE(DOMa)@en[[[baseURI]]]]が対応することになっています。 しかし、[[合成情報集合]]の場合[CODE(InfoProp)[[[基底URI]]]]を同的に計算される[CODE(DOMa)@en[[[baseURI]]]]と一致させることができないはずです。 一致させるためには[[属性]]に関する[[特性]]・[[属性]]の修正が必要ですが、そのような規定はありません。 [10] [[DOM]]と[[情報集合]]の写像 [SRC[DOM3]] によれば、[[属性]], [[文字]][[情報項目]]から[CODE(DOMi)@en[[[Attr]]]], [CODE(DOMi)@en[[[Text]]]], [CODE(DOMi)@en[[[CDATASection]]]][[節点]]への変換で[CODE(DOMa)@en[[[baseURI]]]]は[CODE(DOM)@en[[[null]]]]になるとされています。 しかし、これは[[XML基底]]によって計算するとした本文の規定と矛盾します。 [[注釈]], [[文書型宣言]][[情報項目]]と[CODE(DOMi)@en[[[Comment]]]], [CODE(DOMi)@en[[[DocumentType]]]][[節点]]についても同様です。 ただし、[CODE(DOMa)@en[[[baseURI]]]][[属性]]の定義が参照する[[XML基底]]仕様で[[マーク宣言]]の[[基底URI]]は明確に定義されていません。 (自然に解釈すればそれが含まれる[[要素]]または[[外部実体]]・[[文書実体]]と同じでしょうが、ここで[[外部実体]]内の[[注釈宣言]]に関して[[処理指令]]と同じ問題 (>>7) が発生します。) [11] [[DOM]]と[[情報集合]]の写像 [SRC[DOM3]] によれば、[[処理指令]][[情報項目]]と[CODE(DOMi)@en[[[ProcessingInstruction]]]]では''あれば、[[親要素]]の''[CODE(InfoProp)[[[基底URI]]]]が[CODE(DOMa)@en[[[baseURI]]]]に、 その[[処理指令]][[節点]]の[CODE(DOMa)@en[[[baseURI]]]] (はあれば[[親要素]]の[CODE(DOMa)@en[[[baseURI]]]]と同じ) がその[[処理指令]][[情報項目]][CODE(InfoProp)[[[基底URI]]]]に対応することになっています。 [[親要素]][[情報項目]]がない場合の[CODE(DOMa)@en[[[baseURI]]]]に関する規定がなぜか抜けています。 [12] [[DOM]]と[[情報集合]]の写像 [SRC[DOM3]] によれば、[[未展開実体参照]][[情報項目]]と[CODE(DOMi)@en[[[EntityReference]]]] ([[子供]]なし。) では[CODE(InfoProp)[[[宣言基底URI]]]]と[CODE(DOMa)@en[[[baseURI]]]]が対応することになっています。 そもそも[CODE(DOMa)@en[[[baseURI]]]]の定義が参照する[[XML基底]]仕様では[[実体参照]]の[[基底URI]]など定義されていないのですが、 普通に解釈すれば[[実体参照]]そのものの[[基底URI]]はそれが含まれる[[要素]]の[[基底URI]]になるはずです。 一方[[実体参照]]によって[[展開]]される[[内容]]の側からすれば、 [CODE(DOMi)@en[[[EntityReference]]]][[節点]]は[[実体]]そのもの (の1つの[[実現値]]) に相当する[[節点]]と考えることもできますから、 その[[実体]]そのものの[[基底URI]]にアクセスできる方が便利です。 (ただし、ここで問題にしているのは未展開参照ですから、 その[[基底URI]]はわかっていません。) [[DOM]]の附属書にある[CODE(InfoProp)[[[宣言基底URI]]]]は、 これらいずれとも必ずしも一致しません。[[宣言基底URI]]は[[実体宣言]]の含まれる[[外部実体]]の[[基底URI]]だからです。 本当にそんなもので良いのでしょうか。 ;; [[XML情報集合]]では[[未展開実体参照]][[情報項目]]に[CODE(InfoProp)[[[システム識別子]]]][[特性]]があるので、 その[[解決]]のために[CODE(InfoProp)[[[宣言基底URI]]]][[特性]]も用意されたと考えられます。 [CODE(DOMa)@en[[[systemId]]]][[属性]]がない[CODE(DOMi)@en[[[EntityReferenfce]]]]で一体何に使うのでしょうか。 [13] [[DOM]]と[[情報集合]]の写像 [SRC[DOM3]] によれば、[[非解析対象実体]], [[記法]][[情報項目]]と[CODE(DOMi)@en[[[Entity]]]] ([[非解析対象実体]]。), [CODE(DOMi)@en[[[Notation]]]]では[CODE(InfoProp)[[[宣言基底URI]]]]と[CODE(DOMa)@en[[[baseURI]]]]が対応することになっています。 [CODE(DOMa)@en[[[baseURI]]]][[属性]]の定義が参照する[[XML基底]]仕様にはこれらの[[基底URI]]に関する規定がないので、 これでよいものかどうかはよくわかりませんが。。。 [7] '''外部実体の基底URI''' [[外部実体]]の[[基底URI]]が[[実体参照]]を[[展開]]すると失われる問題 (>>3) について、[[DOM]]仕様書では、[[DOM]][[木]]構築時に[CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]を設定しないといけないかもね、 [[処理指令]]では無理だけど、と述べています。 [SRC[DOM3 中核 1.3.4]] それを受けて[[LS]]仕様では[CODE(DOM)@en[[[pi-base-uri-not-preserved]]]]という[[警告]] が定義されていますが、 [[要素]]に関しては何も ([CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]を修正しろなどの) 規定がありません。 [[#comment]] ** 実装 [15] [[Firefox 1.5]]では、[CODE(DOMi)@en[[[DocumentType]]]], [CODE(DOMi)@en[[[Attr]]]], [CODE(DOMi)@en[[[Comment]]]], [CODE(DOMi)@en[[[Text]]]]でも[[親]]の[CODE(DOMa)@en[[[baseURI]]]]と同じ値が得られるようです。 [18] また、[[Firefox 1.5]]では、[[HTML]][[文書]]であっても[CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]が適用されるようです ([[HTML 5]]案の規定と一致)。 [CODE(DOMi)@en[[[Document]]]][[節点]]の[CODE(DOMa)@en[[[baseURI]]]]は[[DOM水準3]][[中核]]仕様の規定通り [CODE(DOMa)@en[[[base]]]][[要素]] ([[文書]]中どこにあっても。) による指定が反映されます。 しかし、後から[CODE(HTMLa)@en[[[href]]]][[属性]]を書き換えても [WEAK[([CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]でも)]] 各[[節点]]の[CODE(DOMa)@en[[[baseURI]]]] [WEAK[(や[[URI]]系[[属性]])]] には反映されないようです。 [17] 同じく[[Firefox 1.5]]で、主要な[[木]]に属さ''ない''[[節点]]の場合は、 属する[[節点]]と同じように、ただし必要なら[CODE(DOMa)@en[[[ownerDocument]]]][[属性]]をたどることによって[CODE(DOMa)@en[[[baseURI]]]]を算出しているようです。 @@ 各種組合せでの実装テストが必要。 [[#comment]] ** メモ [[#comment]] * メモ