[1] [[XML情報集合]]の[DFN[[CODE(InfoProp)[[RUBYB[宣言基底URI]@en[declaration base URI]]]]]][[特性]]は、
[[非解析対象実体]][[情報項目]]または[[記法]][[情報項目]]に対応する[[マーク宣言]]の[[システム識別子]]を[[解決]]するための[[基底URI]]を[[値]]として持ちます。

* 仕様書

[REFS[
- [2] [CITE@en[XML Information Set (Second Edition)]] ([TIME[2007-10-12 05:43:40 +09:00]] 版) <http://www.w3.org/TR/xml-infoset/#intro.baseURIs>
- [12] [CITE@en[XML Information Set (Second Edition)]] ([TIME[2007-10-12 05:43:40 +09:00]] 版) <http://www.w3.org/TR/xml-infoset/#infoitem.rse>
- [13] [CITE@en[XML Information Set (Second Edition)]] ([TIME[2007-10-12 05:43:40 +09:00]] 版) <http://www.w3.org/TR/xml-infoset/#infoitem.entity.unparsed>
- [14] [CITE@en[XML Information Set (Second Edition)]] ([TIME[2007-10-12 05:43:40 +09:00]] 版) <http://www.w3.org/TR/xml-infoset/#infoitem.notation>
- [23] [CITE@EN[Extensible Markup Language (XML) 1.0 (Fifth Edition)]] ([TIME[2013-05-29 05:49:56 +09:00]] 版) <http://www.w3.org/TR/xml/#dt-sysid>
]REFS]

[3] [[XML情報集合]]は[[XML基底]]を参照していますが
[SRC[XML情報集合 1]]、[[XML情報集合]]に[[マーク宣言]]の[[基底URI]]に関する記述はありません。

* システム識別子の基底URL

[28] [[相対URL]]を指定した場合の[[基底URL]]は、原則として、
[[実体宣言]]が現れた[[資源]]の位置です [SRC[>>23]]。

;; [29] [[記法宣言]]の場合の扱いは明確ではありません。

[33] >>28 の[[資源]]とは、[[実体宣言]]の最初の [CODE(XML)[[[<]]]]
が[[実体]]として[[構文解析]]された時にその [CODE(XML)[[[<]]]]
を含んでいた[[外部実体]]です [SRC[>>23]]。

;; [34] [[実体宣言]]が[[内部実体]]の[[実体文]]に含まれている場合に、
その[[実体宣言]]が実際に含まれている[[ファイル]]ではなく、
[[引数実体参照]]の[[展開]]によって間接的に含まれる直近の[[外部実体]]になります。

[35] [[URL]] は[[型録]]によって置き換えられたり [[HTTPリダイレクト]]されたりすることがありますが、
[[基底URL]]として使うのは最終的な [[URL]] です [SRC[>>23]]。

;; [36] [[資源]]を得るために使った[[プロトコル]]が[[基底URL]]を規定する場合はそちらに従うべきと考えるのが自然ですが、
[[XML]] 仕様上そうはなっていません。これが意図するものなのかは不明です。

[30] 特定の [[DTD]] や[[応用]]によって[[要素型]]や[[処理指令]]の規定がある場合には、
[[基底URL]]はそれに従います [SRC[>>23]]。

;; [32] [[HTML]] の [CODE(HTMLe)@en[[[base]]]] [[要素]]のようなものが想定されているのでしょうが、
実際に >>30 のような役割を規定した例は見つかっていません。

* XML 情報集合

[15] [[XML情報集合]]においては、次の[[情報項目]]に[[宣言基底URI]][[特性]]が定義されています。
[FIG(short list)[
- [[未展開実体参照情報項目]]
- [[非解析対象実体情報項目]]
- [[記法情報項目]]
]FIG]

[16] [[文書型宣言情報項目]]には定義されていません。

* 特性値

[4] '''非解析対象実体情報項目の場合'''

[[システム識別子]]を[[解決]]するために使うべき[[基底URI]]、
すなわち[[実体宣言]]が出現する[[資源]]の[[基底URI]]です。
[SRC[XML情報集合 2.9]]

[5] '''記法情報項目の場合'''

[[システム識別子]]を[[解決]]するために使うべき[[基底URI]]、
すなわち[[記法宣言]]が出現する[[資源]]の[[基底URI]]です。
[SRC[XML情報集合 2.10]]

[7] '''システム識別子の基底URI'''

[[XML]][[システム識別子]]の[[基底URI]]は、
[[マーク宣言]]の最初の[CODE(XML)[<]]を''[[マーク宣言]]として解釈する時点''で含んでいた[[外部実体]]
([[文書実体]]、[[外部部分集合実体]]、または[[外部引数実体]])
の[[基底URI]]です。 [SRC[XML 4.2.2]]

[6] '''逃避'''

[[XML]]の仕様によれば[[システム識別子]]を[[URI]]として使うために[[逃避]]が必要です
[SRC[XML 4.2.2]] が、
この[[特性]]の[[値]]は[[逃避]]''前''のものです。
[SRC[XML情報集合 1]]

[8] '''応用依存'''

[[基底URI]]が[[応用]]依存になる場合の[CODE(InfoProp)[[[宣言基底URI]]]]の値は[[XML情報集合]]仕様では定めません。
[SRC[XML情報集合 1]]

[9]
たとえば、[[パイプ]]から読まれた[[XML]][[文書]]では[[基底URI]]が定まらないかもしれません。

* 関連

[10] [[情報項目]]の種類によっては、[CODE(InfoProp)[[[基底URI]]]][[特性]]があります。

;; [[宣言基底URL]]と[[基底URL]]の両方が存在する[[情報項目]]はありません。

[11] [[DOM3]] によれば、 [[DOM]]の[CODE(DOMa)@en[[[baseURI]]]][[属性]]は[CODE(InfoProp)[[[宣言基底URI]]]]によって決定されます。

;; 現在の [[DOM Standard]] には[[宣言基底URL]]が存在する[[情報項目]]に相当する種類の[[節点]]は含まれていません。

* メモ

[101] [[SE]] の errata の修正 E18
<http://www.w3.org/XML/xml-V10-2e-errata#E18>
(2001-04-24) について。

4.2.2 節 <http://www.w3.org/TR/REC-xml#sec-external-ent>
で、

> XML 1.0 仕様書の適用範囲外の情報が提供されない限り、
(例えば特定の DTD で規定された特別な XML 要素型とか、
特定の応用の仕様で定義されている[[処理指令]]とかで指定されない限り、)
相対 URI はその実体宣言が出現する資源の位置からの関係とします。
従って URI は[[文書実体]]からの関係であったり、外部 DTD
部分集合を含んでいる実体からのであったり、
或いは他の外部引数実体からのものであったりします。

とある件について、次の規定が追加されました。

> これは宣言を開始させる [CODE(XML)[<]] が、
宣言の解釈される時点で含まれている外部実体であると定義します。

[102] >>101 の修正の説明。

> この修正は、相対 URI の基底を決定する目的において、
正確にはどこで宣言が行われたかを明確にします。

[PRE[
[CODE(file)[example.xml]]
 <!DOCTYPE foo [
 <!ENTITY % pe SYSTEM "subdir1/pe">
 %pe;
 %intpe;
 ]>
 <foo>&ent;</foo>
]PRE]

[PRE[
[CODE(file)[subdir1/pe]]
 <!ENTITY % extpe SYSTEM "../subdir2/extpe">
 <!ENTITY % intpe "%extpe;">
]PRE]

[PRE[
[CODE(file)[subdir2/extpe]]
 <!ENTITY ent SYSTEM 'entfile'>
]PRE]

> [CODE(XML)[ent]] の宣言を構成する文字は 
[CODE(file)[subdir2/extpe]] 中に出現しますが、
ここでは宣言として解析されません。
単に [CODE(XML)[intpe]] の置換文を構成する文字として扱われるだけです。
それは [CODE(XML)[intpe]] が解析されるまでは宣言として解析されません。
[CODE(XML)[intpe]] が解析されるのはそれを含めている外部実体が文書実体である所です。
従って適切な基底 URI は [CODE(file)[example.xml]]
の基底 URI となります。
> 使用されるのは含めている外部実体である理由は、
内部実体がその基底 URI 情報を伝達しないことであると言えるでしょう。
確かに、内部実体はその置換文だけを持っています。
> [CODE(file)[example.xml]] が [CODE(XML)[%intpe;]]
ではなく [CODE(XML)[%extpe;]] を含んでいたとすると、
話は変わってきます。 [CODE(file)[subdir2/extpe]]
の内容は宣言として解析され、適当な基底 URI
は [CODE(file)[subdir2]] の基底 URI となります。

[103] >>102 の後半の例:
[PRE[
[CODE(file)[example.xml]]
 <!DOCTYPE foo [
 <!ENTITY % extpe SYSTEM "../subdir2/extpe">
 %extpe;
 ]>
 <foo>&ent;</foo>
]PRE]

[PRE[
[CODE(file)[subdir2/extpe]]
 <!ENTITY ent SYSTEM 'entfile'>
]PRE]

[104] [[SGML]] 的にはどっちの例も、宣言が評価されるのは
DTD であって外部解析実体にはならないと思うのですが、
この考えは間違ってますか?
(実体宣言で宣言された解析実体の内部実体と外部実体の差異は置換文の段階で存在しない (どちらも基底 URI を保持し得ない) のではないでしょうか?)

[105] >>104 SGML も XML も参照を[[置換文]]で置き換える,
置換結果はその文脈の構文と意味を満たさねばならない、
という規定は共通。ただ、 SGML の仕様的にはこういう処理を意図しているような臭いがぷんぷんする。 (あってる? 教えて、偉い人。)
[PRE[
文書実体 <foo>aiueo &ent;          abcdef</foo>
               1) ^ ^ 2)           ^ 5)
実体 ent            いろはにほへと[CODE(SGML)[[[Ee]]]]
                    ^ 3)          ^ 4)
]PRE]
= 文書実体を [SAMP(SGML)[o]] [WEAK[(実体参照の直前)]] まで処理する。
= 実体 [SAMP(SGML)[ent]] への参照を発見。
= -- [[実体管理系]]に実体 [SAMP(SGML)[ent]] を要求。
-- 処理は実体 [SAMP(SGML)[ent]] に移る。
= 実体 [SAMP(SGML)[ent]] が終了。
= 処理は文書実体に戻る。 [SAMP(SGML)[a]] から処理続行。

この処理モデルなら、実体 [SAMP(SGML)[ent]]
中で発見された[[マーク]] (を反映した物体)
の属性として元々どこの実体に所属していたのかという情報を与える余地はある。

でも、このやり方なら内部実体だろうが外部実体だろうが元の
URI は覚えてられるよなあ。。。

[6] 実際問題としては、今の XML errata の解釈辺りで手を売っとかないと、モジュール化 DTD で酷い目に合いますから、妥当なところではあります。

[8] >>4-5  >>2 の説明によれば重要な意義を持つのは内部実体か外部実体かです。
つまり言い換えると、引数実体の参照が評価される場所が実体宣言の中 [WEAK[([SAMP(SGML)[<!ENTITY % ent2 "%ent;">]])]] か
DTD の地の場所 ([CODE(SGML)[[[ds]]]])
[WEAK[([SAMP(SGML)[<!foo>%ent;<!bar>]])]] かです。

>>105 の処理とこのことを考え合わせればうまく説明が付きません?

- [107] ''システム識別子の相対パスについて - SGML から XML へ'' <http://math.oheya.to/markup/sgml/sysid-uri>: 同じ問題を扱ってます。
- [133] ''システム識別子の基底 - XML Core 関連'' <http://www.satoshii.org/markup/xml/sysid-base>

[134]
[103]>>102 の後半の例: の"extpe"のURIの記述は正しいのでしょうか? "../"が余計な様に思うんですが&#65381;&#65381;&#65381;
([[名無しさん]] [TIME[2006-07-12 04:10:54 +00:00]])
