宣言基底URL

宣言基底URL (XML)

[1] XML情報集合宣言基底URI (declaration base URI) 特性は、 非解析対象実体情報項目または記法情報項目に対応するマーク宣言システム識別子解決するための基底URIとして持ちます。

仕様書

[3] XML情報集合XML基底を参照していますが XML情報集合 1XML情報集合マーク宣言基底URIに関する記述はありません。

システム識別子の基底URL

[28] 相対URLを指定した場合の基底URLは、原則として、 実体宣言が現れた資源の位置です >>23

[29] 記法宣言の場合の扱いは明確ではありません。

[33] >>28資源とは、実体宣言の最初の <実体として構文解析された時にその < を含んでいた外部実体です >>23

[34] 実体宣言内部実体実体文に含まれている場合に、 その実体宣言が実際に含まれているファイルではなく、 引数実体参照展開によって間接的に含まれる直近の外部実体になります。

[35] URL型録によって置き換えられたり HTTPリダイレクトされたりすることがありますが、 基底URLとして使うのは最終的な URL です >>23

[36] 資源を得るために使ったプロトコル基底URLを規定する場合はそちらに従うべきと考えるのが自然ですが、 XML 仕様上そうはなっていません。これが意図するものなのかは不明です。

[30] 特定の DTD応用によって要素型処理指令の規定がある場合には、 基底URLはそれに従います >>23

[32] HTMLbase 要素のようなものが想定されているのでしょうが、 実際に >>30 のような役割を規定した例は見つかっていません。

XML 情報集合

[15] XML情報集合においては、次の情報項目宣言基底URI特性が定義されています。

[16] 文書型宣言情報項目には定義されていません。

特性値

[4] 非解析対象実体情報項目の場合

システム識別子解決するために使うべき基底URI、 すなわち実体宣言が出現する資源基底URIです。 XML情報集合 2.9

[5] 記法情報項目の場合

システム識別子解決するために使うべき基底URI、 すなわち記法宣言が出現する資源基底URIです。 XML情報集合 2.10

[7] システム識別子の基底URI

XMLシステム識別子基底URIは、 マーク宣言の最初の<マーク宣言として解釈する時点で含んでいた外部実体 (文書実体外部部分集合実体、または外部引数実体) の基底URIです。 XML 4.2.2

[6] 逃避

XMLの仕様によればシステム識別子URIとして使うために逃避が必要です XML 4.2.2 が、 この特性逃避のものです。 XML情報集合 1

[8] 応用依存

基底URI応用依存になる場合の宣言基底URIの値はXML情報集合仕様では定めません。 XML情報集合 1

[9] たとえば、パイプから読まれたXML文書では基底URIが定まらないかもしれません。

関連

[10] 情報項目の種類によっては、基底URI特性があります。

宣言基底URL基底URLの両方が存在する情報項目はありません。

[11] DOM3 によれば、 DOMbaseURI属性宣言基底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 部分集合を含んでいる実体からのであったり、 或いは他の外部引数実体からのものであったりします。

とある件について、次の規定が追加されました。

これは宣言を開始させる < が、 宣言の解釈される時点で含まれている外部実体であると定義します。

[102] >>101 の修正の説明。

この修正は、相対 URI の基底を決定する目的において、 正確にはどこで宣言が行われたかを明確にします。

example.xml
 <!DOCTYPE foo [
 <!ENTITY % pe SYSTEM "subdir1/pe">
 %pe;
 %intpe;
 ]>
 <foo>&ent;</foo>
subdir1/pe
 <!ENTITY % extpe SYSTEM "../subdir2/extpe">
 <!ENTITY % intpe "%extpe;">
subdir2/extpe
 <!ENTITY ent SYSTEM 'entfile'>

ent の宣言を構成する文字は subdir2/extpe 中に出現しますが、 ここでは宣言として解析されません。 単に intpe の置換文を構成する文字として扱われるだけです。 それは intpe が解析されるまでは宣言として解析されません。 intpe が解析されるのはそれを含めている外部実体が文書実体である所です。 従って適切な基底 URI は example.xml の基底 URI となります。

使用されるのは含めている外部実体である理由は、 内部実体がその基底 URI 情報を伝達しないことであると言えるでしょう。 確かに、内部実体はその置換文だけを持っています。

example.xml%intpe; ではなく %extpe; を含んでいたとすると、 話は変わってきます。 subdir2/extpe の内容は宣言として解析され、適当な基底 URI は subdir2 の基底 URI となります。

[103] >>102 の後半の例:

example.xml
 <!DOCTYPE foo [
 <!ENTITY % extpe SYSTEM "../subdir2/extpe">
 %extpe;
 ]>
 <foo>&ent;</foo>

subdir2/extpe
 <!ENTITY ent SYSTEM 'entfile'>

[104] SGML 的にはどっちの例も、宣言が評価されるのは DTD であって外部解析実体にはならないと思うのですが、 この考えは間違ってますか? (実体宣言で宣言された解析実体の内部実体と外部実体の差異は置換文の段階で存在しない (どちらも基底 URI を保持し得ない) のではないでしょうか?)

[105] >>104 SGML も XML も参照を置換文で置き換える, 置換結果はその文脈の構文と意味を満たさねばならない、 という規定は共通。ただ、 SGML の仕様的にはこういう処理を意図しているような臭いがぷんぷんする。 (あってる? 教えて、偉い人。)

文書実体 <foo>aiueo &ent;          abcdef</foo>
               1) ^ ^ 2)           ^ 5)
実体 ent            いろはにほへとEe
                    ^ 3)          ^ 4)
  1. 文書実体を o (実体参照の直前) まで処理する。
  2. 実体 ent への参照を発見。
  3. -- 実体管理系に実体 ent を要求。
    • 処理は実体 ent に移る。
  4. 実体 ent が終了。
  5. 処理は文書実体に戻る。 a から処理続行。

この処理モデルなら、実体 ent 中で発見されたマーク (を反映した物体) の属性として元々どこの実体に所属していたのかという情報を与える余地はある。

でも、このやり方なら内部実体だろうが外部実体だろうが元の URI は覚えてられるよなあ。。。

[6] 実際問題としては、今の XML errata の解釈辺りで手を売っとかないと、モジュール化 DTD で酷い目に合いますから、妥当なところではあります。

[8] >>4-5 >>2 の説明によれば重要な意義を持つのは内部実体か外部実体かです。 つまり言い換えると、引数実体の参照が評価される場所が実体宣言の中 (<!ENTITY % ent2 "%ent;">) か DTD の地の場所 (ds) (<!foo>%ent;<!bar>) かです。

>>105 の処理とこのことを考え合わせればうまく説明が付きません?

[134] [103]>>102 の後半の例: の"extpe"のURIの記述は正しいのでしょうか? "../"が余計な様に思うんですが&#65381;&#65381;&#65381; (名無しさん )