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