[67] [CODE(DOMi)@en[[[Node]]]] の [DFN[[CODE(DOMa)@en[[[baseURI]]]] [[属性]]]]は、
[[文書の基底URL]]を返します。

* 仕様書

[REFS[
- [29] '''[CITE@en[DOM Standard]] ([TIME[2015-08-25 21:41:23 +09:00]] 版) <https://dom.spec.whatwg.org/#dom-node-baseuri>'''
- [34] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-09-03 15:16:48 +09:00]] 版) <https://html.spec.whatwg.org/#the-element's-base-url>
]REFS]

* 意味

[HISTORY[
[99] [DFN[[RUBYB[[[要素の基底URL]]]@en[the element's base URL]]]]は、
[[要素]]の[[節点文書]]の[[基底URL]]です [SRC[>>34]]。

[98] かつては[[節点]]が異なる[[基底URL]]を持つことがあるとされていました。
例えば [[XML]] には [CODE(XMLa)@en[[[xml:base]]]] [[内容属性]]がありました。
しかし現在ではそうした機能は削除され、[[文書]]全体で1つの[[基底URL]]
を持つことになっています。
]HISTORY]

* 取得器

[30] [[取得器]]は、[[文脈オブジェクト]]の[F[[[節点文書]]]]の[F[[[文書基底URL]]]]を[[URL直列化器]]を通して得た
[CODE(IDL)@en[[[DOMString]]]] を返さなければ[['''なりません''']] [SRC[>>29]]。

[33] [CODE(HTMLe)@en[[[base]]]] [[要素]]によって[[文脈オブジェクト]]の[F[[[節点文書]]]]の[F[[[文書の基底URL]]]]
が変更されると、本[[属性値]]も自動的に変化します。

* 設定器

[31] [CODE(DOMa)@en[[[baseURI]]]] [[属性]]は[[読み取り専用]]です [SRC[>>29]]。
[[設定器]]はありません。

;; [23] 変更したい時は、 [CODE(HTMLe)@en[[[base]]]] [[要素]]によって[[文書の基底URL]]
を設定する必要があります。

* 基底 URL の変更の影響

@@ [97] [[DOM]]/[[HTML]] の[[基底URL]]の定義の再編 (>>95) 途中のため本節の内容は仕様書上不整合になっています。技術的な内容は変化しないと思われます。

[75] [[要素]]が[DFN[[RUBYB[[[基底URLの変更に影響される]]]@en[affected by a base URL change]]]]時、
[[基底URL変更手順]]を実行しなければ[['''なりません''']] [SRC[>>74]]。

[78] [[要素]]が基底 URL の変更に影響されるのは次の場面です。
[FIG(list)[
- [79] [[要素]]を [[adopt]] したとき、その[[要素]] [SRC[>>81]]
- [82] [DEL[[CODE(XMLa)@en[[[xml:base]]]] [[属性]]を設定、変更、削除したとき、その[[要素]]と[[子孫]]の[[要素]] [SRC[>>80]]]]
- [83] [[文書基底URL]]が変化したとき、[[文書]]中のすべての[[要素]] [SRC[>>80]]
]FIG]

;; [86] [[HTML Standard]] は[[子孫要素]]も明示的に含まれるとしていますが、 [[DOM Standard]] はそうしていません ([[adopt]]
は再帰的な手順でもありません)。また [[adopt]] は[[要素]]を挿入した時に呼び出されますが、逆に[[要素]]を削除した時には >>78
のいずれも該当しません。また >>83 は[[文書]]に所属し、[[文書中]]にはない[[要素]]についてはカバーしていません。
とはいえ、現時点では >>77 のいずれもこれらの点の影響を受けません。

[77] [DFN[[RUBYB[[[基底URL変更手順]]]@en[base URL change steps]]]] [SRC[>>76]] には次のものがあります。
[FIG(list)[
- [84] [[要素]]が[[ハイパーリンク]]を作る時、当該[[ハイパーリンク]]の [CODE(HTMLa)@en[[[href]]]] [[属性]]や
[CODE(HTMLa)@en[[[ping]]]] [[属性]]に基づく表示を更新する [SRC[>>80]]
- [85] [CODE(HTMLe)@en[[[blockquote]]]], [CODE(HTMLe)@en[[[q]]]], [CODE(HTMLe)@en[[[ins]]]],
[CODE(HTMLe)@en[[[del]]]] の [CODE(HTMLa)@en[[[cite]]]] [[属性]]に基づく表示を更新する [SRC[>>80]]
]FIG]

;; [87] つまり[[リンク先]]の表示に影響があり、また実際に[[リンク]]をたどる時にはその時点での[[基底URL]]に基づき[[解決]]されるわけですから、
自動的に[[基底URL]]の変更が反映されることになります。一方で、埋め込み系の [[URL]] ([CODE(HTMLa)@en[[[src]]]]
[[属性]]や[[スタイル・シート]]を埋め込む [CODE(HTMLe)@en[[[link]]]] [[要素]]など)
は[[基底URL]]が変化してもそれに追随しません。ただし [[IDL属性]]の [CODE(DOMa)@en[[[src]]]]
などは取得した時点での[[基底URL]]に対して[[解決]]されますから、実際に使われている [[URL]]
とは違うことがあります。

* 歴史

** 基底 URI (XSLT データ・モデル)

[26] [[XSLT]] の[[データ・モデル]]においても[DFN[基底 URI]] の概念があります。
なお、 [[XSLT 1.0]] や [[XSLT 1.1]] の[[データ・モデル]]の礎となっている [[XPath 1.0]]
の[[データ・モデル]]にはそれに相当する概念はありませんでした。

[35] [[XSLT 1.0]] では、[[基底URI]] は各[[節点]]について規定されています。

;; [[XSLT 1.0]] は [[XML基底]]以前に定義されたものなので、 [CODE(XMLa)@en[[[xml:base]]]]
[[属性]]は反映されません。

[36] [[XSLT 1.1]] では、基本的に [[XML基底]]に従って[[基底URI]] が算出されます。

[REFS[
- [25] [[XSLT 1]]
-- [CSECTION@en[3.2 Base URI]] <IW:XSLT1:"#base-uri">
-- [CSECTION@en[3.3 Unparsed Entities]] <IW:XSLT1:"#unparsed-entities">
-- [CITE@en[Errata in REC-xslt-19991116]] 
<http://www.w3.org/1999/11/REC-xslt-19991116-errata/#E5>
]REFS]

*** 節点と基底 URI

[24]
,	,[[XSLT 1.0]]	,[[XSLT 1.1]]
,[[文書節点]]	,[[文書実体]]の[[URI]]	,(規定なし)
,[[根節点]]	,(規定なし)	,[[文書実体]]の[[URI]]
,[[要素節点]]	,[[外部実体]]中なら[[外部実体]]の[[URI]]、そうでなければ[[文書]]の[[基底URI]]	,[[XML基底]]による
,[[処理指令節点]]	,[[外部実体]]中なら[[外部実体]]の[[URI]]、そうでなければ[[文書]]の[[基底URI]]	,[[XML基底]]による
,"[[文節点]], [[注釈節点]], [[属性節点]]"	,[[親節点]]の[[基底URI]]	,==
,[[名前空間節点]]	,[[親節点]]の[[基底URI]]	,実装依存
,[[非解析対象実体]]の[[システム識別子]]	,[[実体宣言]]を含む[[資源]]の[[基底URI]]	,==

;;
- [61] [Q[[[文書実体]]・[[外部実体]]の[[基底URI]]]]では''なく''て[Q[[[文書実体]]・[[外部実体]]の[[URI]]]]なのがちょっと・・・。
- [62] それでいて[Q[そうでなければ[[文書]]の[[基底URI]]]]とは何事か。
[[文書実体]]や[[文書節点]]ではなく、[[文書]]の[[基底URI]]なのか?
- [63] そもそも[[文書節点]]という語も、ここ1箇所でしか出てこない ([[根節点]]の誤りか)。

** [CODE(InfoProp)[XML基底]]特性 (XML情報集合)

[40] [[XML情報集合]]の[DFN[[CODE(InfoProp)[[RUBYB[基底URI] @en[base URI]]]]]][[特性]]は、
その[[情報項目]]の[[基底URI]]を値として保持します。
この[[特性]]は、
- [[文書情報項目]]
- [[要素情報項目]]
- [[処理指令情報項目]]

で定義されています。

[REFS[
- [41] [[XML情報集合]]
-- [CSECTION@en[Base URIs]]
<http://www.w3.org/TR/xml-infoset/#intro.baseURIs>
-- [CSECTION@en[2.1. The Document Information Item]]
<http://www.w3.org/TR/xml-infoset/#infoitem.document>
-- [CSECTION@en[2.2. Element Information Items]]
<http://www.w3.org/TR/xml-infoset/#infoitem.element>
-- [CSECTION@en[2.4. Processing Instruction Information Items]]
<http://www.w3.org/TR/xml-infoset/#infoitem.pi>
- [42] [[XML基底]] <http://www.w3.org/TR/xmlbase/>
]REFS]

*** 特性値

**** 文書情報項目の場合

[43] 
[FIG(steps)[
= [[文書実体]]の[[基底URI]]です。 [SRC[XML情報集合 2.1]]
= [[XML基底]]仕様に従います。 [SRC[XML情報集合 1]]
= [[RFC 2396]]に従います。 [SRC[XML基底 4]]
]FIG]

[44] [[XML基底]]の仕様書の内容には多少曖昧な点もありますが、
[[RFC 2396]]の規定と矛盾する規定を行う意図はなさそうなので、
[FIG(steps)[
= [[転送プロトコル]]によってもたらされた[[基底URI]]
= [[文書実体]]の[[取出し]]に用いた[[URI]]
([[リダイレクト]]がある場合は、最終的な[[URI]])
= [[応用]]の文脈に依存した[[URI]]
]FIG]
の順で決定するものと思われます。

**** 要素情報項目の場合

[45] 
[FIG(steps)[
= [[要素]]の[[基底URI]]です。 [SRC[XML情報集合 2.2]]
= [[XML基底]]仕様に従います。 [SRC[XML情報集合 1]]
= [CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]の項を参照。
]FIG]

**** 処理指令情報項目の場合

[46] 
[FIG(steps)[
= [[処理指令]]の[[基底URI]]です。 [SRC[XML情報集合 2.4]]
= [[XML基底]]仕様に従います。 [SRC[XML情報集合 1]]
= [CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]の項を参照。
]FIG]

**** エスケープ

[47] [CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]の[[値]]を[[URI参照]]として使うためには[RUBY[[[逃避]]][エスケープ]]が必要です
[WEAK[([CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]の項を参照してください。)]]
が、[[特性値]]はその''前''のものです。
[SRC[XML情報集合 1]]

**** 応用依存

[48] [[XML基底]]仕様で[[基底URI]]が[[応用]]依存になる場合に関して、
[[XML情報集合]]仕様は[CODE(InfoProp)[[[基底URI]]]]の値を規定しません。
[SRC[XML情報集合 1]]

;; 
[15] 
[[DTD]]を[[処理]]するか否かによって結果が異なり得る[[特性]]では[[値]]が[[無値]]や[[未知]]になることもありますが、
[CODE(InfoProp)[[[基底URI]]]]ではそれは無いようです。
[[DTD]]を[[処理]]しない場合に関しても[[XML基底]]仕様で[[基底URI]]が明確に定義されているためでしょうか。
(実際[[DTD]]を[[処理]]していないからといって[[無値]]や[[未知]]にされては役に立ちませんしw)

**** URL の定義

[37] [[XDM]] は [CODE(InfoProp)[[[基底URI]]]]が[[非ASCII文字]]を含むことがあるとしています。

[REFS[
- [38] [CITE@en[XQuery 1.0 and XPath 2.0 Data Model (XDM) (Second Edition)]] ([TIME[2010-12-17 00:06:35 +09:00]] 版) <http://www.w3.org/TR/2010/REC-xpath-datamodel-20101214/#const-infoset-document>
]REFS]

*** SML の基底 URL

[49] [[SML-IF]] では[CODE(InfoProp)[[[基底URI]]]]に関する2種類の処理モデルが定義されています。
1つは[[XML基底]]に基づく [CODE(XMLa)@en[[[xml:base]]]] [[属性]]を使った標準的な方法で、
もう1つは互換性のための独自の方法です。[[SML-IF消費器]]はいずれかを実装しなければ[['''なりません''']]。
[[SML-IF生産器]]は前者の [CODE(XMLa)@en[[[xml:base]]]] [[属性]]の方法は実装しなければ[['''なりません''']]が、
後者の独自の方法の実装は義務付けられていません。 [SRC@en[[[SML-IF]]]]

[REFS[
- [50] [CITE@en-US[Service Modeling Language Interchange Format Version 1.1]] ([TIME[2009-05-12 17:50:21 +09:00]] 版) <http://www.w3.org/TR/2009/REC-sml-if-20090512/#Base_URI>
]REFS]

**** [CODE(XML)@en[smlif:baseURI]] 機構

[51] [[SML-IF]] 独自の処理モデルである [DFN[[CODE(XML)@en[[[smlif:baseURI]]]] [RUBYB[機構]@en[mechanism]]]]では、
[[要素情報項目]]の[CODE(InfoProp)[[[基底URI]]]] を次のように決定します。 [SRC@en[[[SML-IF]]]]
[FIG(steps)[
= 当該[[要素情報項目]]が[[交換モデル]]中の[[文書]]の一部なら ([[先祖要素]]が [CODE(XMLe)@en[[[smlif:locator]]]]
などなら)、[[文書基底URI]]です。[DFN[[RUBYB[文書基底][document base]] URI]] とは、次の [[RFC 3986]] [[絶対URI]]
です。
== [CODE(XML)@en[[[docInfo/baseURI]]]] [[要素]]が存在する場合、その値が[[相対参照]]なら[[交換モデル基底URI]]
について[[解決]]したもの、[[相対参照]]でないなら値そのものです。
== そうでなく、[[交換モデル基底URI]] が値を持つ場合、その値です。
== そうでない場合、値を持ちません。
= そうでない場合、[[交換モデル基底URI]]です。[DFN[[RUBYB[交換モデル基底]@en[interchange model base]] URI]] は、
[CODE(XML)@en[[[/model/identity/baseURI]]]] [[要素]]が存在する場合はその値、そうでない場合は値なしです。
]FIG]

[52] [[SML-IF]] では[[相対参照]]が必要な場合に本処理モデルに基づく、あるいは [CODE(XMLa)@en[[[xml:base]]]]
[[属性]]による[[基底URL]] の明記が義務付けられており、[[相対参照]]の[[解決]]においてより上位の[[基底URL]]
([[文書実体]]の [[URL]] など) が用いられることはないとされています [SRC@en[[[SML-IF]]]]。
ただし >>30 からわかるようにその規定が従われなかった場合に[CODE(InfoProp)[[[基底URI]]]]
が[[値なし]]になってしまうことがあります。また、[[SML-IF生成器]]も2つの処理モデルのいずれかのための[[基底URL]]
を指定することしか義務付けられていないので、 [[SML-IF消費器]]側が異なる処理モデルを選択している場合にも[CODE(InfoProp)[[[基底URI]]]]
が[[値なし]]となりえます。

*** 関連

[53] [[合成情報集合]] ([[XML]][[文書]]から生成してすぐの[[情報集合]]''以外'')
では、[CODE(InfoProp)[[[基底URI]]]]と[CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]][[情報項目]]に齟齬が生じていることもあります。
[SRC[XML情報集合 1]]

[54] [[外部実体]]の直下に[[処理指令]]がある場合、
その[[外部実体]]の[[基底URI]]が[[処理指令]]の[[基底URI]]になりますが、
[[処理指令]][[情報項目]]を含む[[情報集合]]を[[直列化]]する時にその[[基底URI]]の情報は保存する方法がありません。
[SRC[XML情報集合 2.4]]

[55] [[非解析対象実体]][[情報項目]]や[[記法]][[情報項目]]には、
[CODE(InfoProp)[[[宣言基底URI]]]]という[[特性]]が定義されています。

[56] [[DOM]]の[CODE(DOMa)@en[[[baseURI]]]][[特性]]は[CODE(InfoProp)[[[基底URI]]]]ではなく、
[CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]に基づき定義されています。

[57] [[XInclude]]では[[基底URI]]を保存するために[CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]を追加して整合性を維持することがあります。

[58] [CODE(InfoProp)[[[基底URI]]]]と[CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]では、
[CODE(InfoProp)[[[基底URI]]]]の方を優先して[[相対参照]]の[[解決]]に使うべきとされています。
[SRC[XML情報集合 1]]

[59] [[RDF/XML]][[構文]]を定義する[[事象]]モデルでは、
[[根]][[事象]]と[[要素]][[事象]]に[CODE@en[[[base-uri]]]][[アクセス子]]があり、
共に[CODE(InfoProp)[[[基底URI]]]][[特性]]から値を得ることとされています。

[60] [[XPath 1.0]]の[[データ・モデル]]には、
[CODE(InfoProp)[[[基底URI]]]]に相当するものがありません。

[[XSLT 1]]の[[データ・モデル]]における[CODE(InfoProp)[[[基底URI]]]]相当のものに関しては、
>>26 を参照してください。

** DOM3 における [CODE(DOMa)@en[baseURI]] 属性

[3] [[DOM水準3]]で[CODE(DOMi)@en[[[Node]]]][[界面]]に追加された[[読取専用属性]][DFN[[CODE(DOMa)@en[baseURI]]]]は、
その[[節点]]の[[基底URI]]を表します。

[REFS[
- [1] [DOM 3]
-- 中核 [CSECTION@en[1.3.4 Base URIs]]
<IW:DOM3:"Core/core.html#baseURIs-Considerations">
-- 中核 [CODE(DOMi)@en[[[Node]]]] [CODE(DOMa)@en[[[baseURI]]]]
<IW:DOM3:"Core/core.html#Node3-baseURI">
-- 中核 [CODE(DOMi)@en[[[Document]]]] [CODE(DOMa)@en[[[documentURI]]]]
<IW:DOM3:"Core/core.html#Document3-documentURI">
-- 中核 [CSECTION@en[Appendix C: Infoset Mapping]]
<IW:DOM3:"Core/infoset-mapping.html">
]REFS]

*** XML DOMの場合の属性値

[FIG(steps)[
[FIGCAPTION[
[2] [SRC[DOM3 中核]]
]FIGCAPTION]
= [[XML基底]]に従って計算し、得た[[絶対URI]]です。
([Q[[[URI]]]]は[[DOM URI]]の意味か?)
= 得られなかった場合は、 [CODE(DOM)@en[[[null]]]]とします。
]FIG]

[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]] <IW:DOM3:"XPath/xpath.html#XPathNamespace">)]]
に関しては、相当する規定が参照されている[[XML基底]]仕様書に含まれていないので、
どんな値になるべきなのかがよくわかりません。

それ以外の種類の[[節点]]も、[[XML基底]]と[[DOM]]の附属書の規定
(>>8-13) に矛盾か見られます。

[16] '''部分木'''

[CODE(DOMi)@en[[[Document]]]][[節点]]から連なる主となる[[木]]に属さない[[節点]]
[WEAK[(例えば、[CODE(DOMm)@en[[[createElementNS]]]]したばかりの[[節点]])]]
は [WEAK[(そもそもそのようなものがない)]] [[XML仕様]]では[[基底URI]]が規定されていませんが、
[[DOM]]の仕様書でも規定されていません。

*** HTML DOM の場合の属性値

[4]
[CODE(DOMi)@en[[[Document]]]]が[[機能]] [CODE(DOM)@en[[[HTML]]]]
([[DOM水準2]] [[HTML]]仕様が参照されています。)
に対応している場合 [SRC[DOM3 中核]]:
[FIG(steps)[
= [CODE(HTMLe)@en[[[base]]]][[要素]]の[CODE(HTMLa)@en[[[href]]]][[属性]]があれば、その値を使って計算します。
= 無い場合は、[CODE(DOM)@en[[CODE(DOMi)@en[[[Document]]]].[CODE(DOMa)@en[[[documentURI]]]]]]です。
]FIG]

[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]]であるとは一言も述べられていません。
どうしろというのでしょうか。

*** 関連

[6] [[合成情報集合]]では[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]]が[[実体参照]]を[[展開]]すると失われる問題
(>>3) について、[[DOM]]仕様書では、[[DOM]][[木]]構築時に[CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]を設定しないといけないかもね、
[[処理指令]]では無理だけど、と述べています。
[SRC[DOM3 中核 1.3.4]]

それを受けて[[LS]]仕様では[CODE(DOM)@en[[[pi-base-uri-not-preserved]]]]という[[警告]]
<IW:DOM3:"LS/load-save.html#LS-LSParser"> が定義されていますが、
[[要素]]に関しては何も ([CODE(XMLa)@en[[[xml]]:[[base]]]][[属性]]を修正しろなどの)
規定がありません。

** 00年代の [CODE(DOMa)@en[baseURI]] 属性の実装

[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]]]]を算出しているようです。

[71] [[Chrome]] では[[文書中]]にない[[要素]]だと[[空文字列]]になります。 [TIME[2013-01-19T13:16:03.500Z]]

[72] [[Firefox]] では [CODE(DOMi)@en[[[DocumentType]]]] は[[親]]と同じ[[基底URL]]になるようですが、
[[Chrome]] では [[null]] になります。 [TIME[2013-01-19T13:20:54.00Z]]

[73] [[URL]] を[[解決]]できない場合にあっては、 [[Firefox]] はそれを無視してもう一段階上位の[[基底URL]]を返すようです。
[[Chrome]] は[[空文字列]]を返すようです。 [TIME[2013-01-19T13:30:43.200Z]]

** HTML5

[94] [[HTML5]] によって動的な[[基底URL]]の変化の[[要素]]への影響が明確化されました。

** DOM4

[96] [[DOM Standard]] によって仕様書上の概念として[[基底URLの変更に影響される]] (>>75)、[[基底URL変更手順]] (>>77)
が定義され、 [[HTML Standard]] はこれを用いて定義する形に改められました。

[REFS[
- [64] [CITE@en-US[DOM Standard]] ([TIME[2013-01-07 19:58:20 +09:00]] 版) <http://dom.spec.whatwg.org/#concept-node-base-url>
- [66] '''[CITE@en-US[DOM Standard]] ([TIME[2013-01-07 19:58:20 +09:00]] 版) <http://dom.spec.whatwg.org/#dom-node-baseuri>'''
- [74] [CITE@en-US[DOM Standard]] ([TIME[2013-01-07 19:58:20 +09:00]] 版) <http://dom.spec.whatwg.org/#affected-by-a-base-url-change>
- [76] [CITE@en-US[DOM Standard]] ([TIME[2013-01-07 19:58:20 +09:00]] 版) <http://dom.spec.whatwg.org/#base-url-change-steps>
- [81] [CITE@en-US[DOM Standard]] ([TIME[2013-01-07 19:58:20 +09:00]] 版) <http://dom.spec.whatwg.org/#concept-node-adopt>
- [80] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2013-01-19 01:02:17 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#dynamic-changes-to-base-urls>
]REFS]

*** 節点の基底 URL

[65] [[節点]]は[DFN[[RUBYB[基底 URL]@en[base URL]]]] を持ちます [SRC[>>64]]。

[70] ただし [[DOM Standard]] は他の仕様書においてそれが定義されるとしており、
具体的にどの仕様書でそれが定義されているのかは明記されていません。

*** 属性値

[68] [CODE(HTMLa)@en[[[baseURI]]]]
[[属性]]は [CODE(DOMi)@en[[[DOMString]][[?]]]] です [SRC[>>66]]。

[69] 当該[[節点]]の[[基底URL]]を返します [SRC[>>66]]。

** 再び DOM から HTML へ

[95] [[DOM Standard]] の[[基底URLの変更に影響される]] (>>75)、[[基底URL変更手順]] (>>77)
の定義は削除され、より一般的な [[adopting steps]] に変更されました。[[基底URL]]
の変化の処理は [[HTML Standard]] 側に統合されることになっています [SRC[>>93]]。

[REFS[
- [89] [CITE@en[Bug 23810 – When adopting, "If node is an element, it is affected by a base..."]]
( ([TIME[2014-02-11 09:56:13 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=23810>
- [92] [CITE[Also run base URL change steps for nested elements. https://www.w3.org/B... · 8b87826 · whatwg/dom]]
( ([TIME[2014-04-11 23:01:09 +09:00]] 版))
<https://github.com/whatwg/dom/commit/8b87826a4a153f386152b44c691b9413eed93ed5>
- [93] [CITE[Make the adopt hook more generic. https://www.w3.org/Bugs/Public/show_bu... · e50fd71 · whatwg/dom]]
( ([TIME[2014-04-11 23:02:38 +09:00]] 版))
<https://github.com/whatwg/dom/commit/e50fd7138f1bf288c4fa0b92f1673359a3affadb>
]REFS]

[39] [CITE[''''''[''''''whatwg'''''']'''''' Document's base URI should use the document's *current* address]]
( ([TIME[2011-07-20 08:43:41 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-July/032565.html>

[19] [CITE[IRC logs: freenode / #whatwg / 20100913]]
( ([TIME[2010-09-26 22:31:37 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20100913#l-1054>

[88] [CITE[IRC logs: freenode / #whatwg / 20140116]]
( ([TIME[2014-01-17 23:23:36 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140116#l-704>


[90] [CITE[IRC logs: freenode / #whatwg / 20140207]]
( ([TIME[2014-02-10 22:38:26 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140207#l-546>

[91] [CITE@en[Web Applications 1.0 r1821     Define what should happen when the base URL changes, keeping it as lightweight as possible.]]
( ([TIME[2008-06-28 06:50:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=1820&to=1821>

** [CODE(XMLa)@en[xml:base]] 属性の廃止

[REFS[
- [20] [CITE@en[20976 – Define base URLs in DOM]]
([TIME[2015-08-04 13:48:35 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=20976>
- [21] [CITE@en[Design base URL change notification system · Issue #61 · whatwg/dom]]
([TIME[2015-08-04 13:49:17 +09:00]] 版)
<https://github.com/whatwg/dom/issues/61>
- [22] [CITE@en[Changes in the base are not reflected often enough · Issue #54 · whatwg/url]]
([TIME[2015-08-15 11:35:58 +09:00]] 版)
<https://github.com/whatwg/url/issues/54>
- [27] [CITE@en[Tie base URLs to documents. Obsoletes xml:base. Fixes https://www.w3.… · whatwg/dom@8ca4959]] ([TIME[2015-09-03 22:31:52 +09:00]] 版) <https://github.com/whatwg/dom/commit/8ca4959505f531663bc91f064a19762e8b90b810>
- [28] [CITE@en[Remove xml:base dependency · whatwg/html@56f4346]] ([TIME[2015-09-03 22:32:12 +09:00]] 版) <https://github.com/whatwg/html/commit/56f4346ec71b2dc138038ce6512b626d6c563e00>
]REFS]

[100] [CITE@en[Remove the "element's base URL" indirection · whatwg/html@199c0c0]]
([TIME[2015-12-19 11:01:44 +09:00]] 版)
<https://github.com/whatwg/html/commit/199c0c0569bc0e312bb70bffa8ef2f85231f4cd1>

[101] [CITE@en[Fix #131: baseURI is not nullable · whatwg/dom@f69832f]]
([TIME[2016-01-02 11:23:16 +09:00]] 版)
<https://github.com/whatwg/dom/commit/f69832f96eea6d7fb8028aeac7e12a887db9f5e6>

[102] [CITE@en[Fix #118: clarify documentURI/URL and baseURI return a serialized value · whatwg/dom@b4664d6]]
([TIME[2016-01-02 11:24:09 +09:00]] 版)
<https://github.com/whatwg/dom/commit/b4664d65f494be62141c85a5efb9c367de8c70bc>

[32] [CITE@en[Use USVString for URLs and origins in IDL]]
( ([[zcorpan]]著, [TIME[2016-05-20 21:56:11 +09:00]]))
<https://github.com/whatwg/dom/commit/1bb85a48e07d1000e00bd792d61247b9a5e2e4ae>