* xml:base 属性 (XML Base) [1] [DFN[[CODE(XMLa)[xml:base]]]] 属性は、 [[HTML]] の [CODE(HTMLe)[base]] 要素型を汎用化して、 [[XML]] の任意の要素の属性として[[基底URI]] を指定できるようにしたものです。 XML Base を使う場合は、[[相対URI参照]]の解決は、 = その要素の [CODE(XMLa)[xml:base]] 属性の値 = その要素の親・先祖の [CODE(XMLa)[xml:base]] 属性の値 = 上位プロトコルによる URI 参照の値 により行われます。 この属性の値は、 - 同じ要素の他の属性値 - 子 [CODE(XML)[#text]] - 子孫要素 - 子孫[[処理命令]] に影響します。特に、 [CODE(XMLa)[xml:base]] 属性の値は''相対 URI でも構わない''ので、その解決にも使われます。 (逆に言えば、子孫の相対 URI 参照の解決には先祖要素の [CODE(XMLa)[xml:base]] 属性を絶対 URI が得られるまで遡り続けないといけないということです。) [2] [CODE(XMLa)[xml:base]] 属性の値の定義は [Q[URI 参照と解釈されるもの]]ですから、 [CODE(URI)[#]] + [[素片識別子]]をつけても構いません。 (あまり意味は無いですが。) URI 参照に使えない文字が入っている場合は [[UTF-8]] にして [[escape]] し''ないといけません''。 (最初から非 URI 文字は含めてはならないと言ってしまえば良いのに、そうしないのはどうせ守らない人が出るのと、 [[IRI]] の絡みでしょうか。) → [[XML//URI]] を参照。 [20] E03 によれば、妥当な URI 参照でない場合の処理は応用依存だそうです。 (>>2 の絡みで、厳密には[Q[URI 参照と解釈できない場合]]とでもしないといけないと思うのですが...) [[#comment]] ** 仕様書 - [21] ''XML Base'' - [22] ''Errata in REC-xmlbase-20010627'' - [6] ''XML Base [日本語訳]'' : Errata 未反映なので注意 [[#comment]] *** Errata による修正 [25] :E01:[Q[文書または外部実体]]が[Q[文書実体または外部実体]]に改められました。 :E02:注意として、 [[XML Schema]] のような外部的方法で既定属性値を与えることによる問題への言及が追加されました。 妥当性を検証する処理器であっても、[[情報集合]]を構築した後に [CODE(XMLa)[xml:base]] 属性を追加すると、 [CODE(infoprop)[基底 URI]] 特性との同期が崩れます。 :E03:妥当な URI 参照ではない値の [CODE(XMLa)[xml:base]] 属性がある要素の基底 URI は応用依存と追記されました。 ** スキーマ等との関係 [3] この属性自体は、 [[XML名前空間]]を使わない場合も使うことが出来ます。 また、 [CODE(XML)[[[xml]]]] 名前空間は暗黙の宣言がなされていますから、 [CODE(XMLa)[[[xmlns]]:xml]] 属性による陽な宣言なしで使うことが出来ます。 [24] [[XML基底]]仕様書にも注記がありますが、 [CODE(XMLa)[xml:base]] 属性に DTD や外部スキーマで初期値が設定されていると、 [[妥当性]]を検証しない処理器などで正しい値が得られませんから、好ましくありません。 [11] >>5 ですから、既定値は DTD の内部部分集合で指定するか、 又は直接指定する'''べき'''だとされています。 (, ) [[#comment]] ** 各種データ・モデルとの関係 [29] [[XML情報集合]]は、 XML 基底仕様書の規定に基づく[[要素情報項目]]の [CODE(infoprop)[[[基底URI]]]] 特性を定義しています。 >>25 の E02 の通り、一旦情報集合を構築してしまった後は [CODE(XMLa)[xml:base]] 属性情報項目と [CODE(infoprop)[基底 URI]] 特性は切り離されてしまいます。 [30] [[DOM 3]] の [CODE(DOMi)[[[Node]]]] 界面の [CODE(DOMa)[[[baseURI]]]] 属性は基底 URI を保持しています。 XML 情報集合の [CODE(infoprop)[基底 URI]] とは異なり、 [CODE(DOMa)[baseURI]] の値は (XML 基底仕様書に基づく) 計算により求めます。 [CODE(XMLa)[xml:base]] 属性節と [CODE(DOMa)[baseURI]] は同期しています。 [[#comment]] ** 応用言語と xml:base 属性 [23] [CODE(XMLa)[xmlns]] 系属性の値も URI 参照 (XML 名前空間 1.1 では [[IRI参照]]) で、相対 URI 参照である可能性があります (常識的な仕様とは思えません:))。 [WEAK[(一応今では非推奨になっています。)]] しかしこの URI/IRI 参照は単なる識別子で、 解決する必要があるものではありませんから、そのまま扱います。 但しその名前空間 URI/IRI 参照をたどってみる場合には [CODE(XML)[xml:base]] 属性の値を使って解決するのも勝手だそうです。 (そういえば XML 基底では IRI 参照の解決の方法は書かれていない。 そのうち改訂されるのか? それとも IRI 参照を解決する時には URI 参照に変換するのか?) [4] [[XHTML]] の使用については XML Base 仕様書は参考で曖昧なことを書いています。 実際のところ W3C の [[XHTML 1]] の [[DTD]] には[CODE(XMLa)[xml:base]] 属性は定義されていませんから、 そのままでは使えません。 [[XHTML 2.0]] [[WD]] では明確に使用できると定義されています。 [5] XML Base を使用できると明記していない仕様では、 XML Base 対応 [[UA]] と非対応 UA で挙動が異なることになるので無理して使用しない方が良いと思われます。 [[#comment]] *** xml:base 属性 (XML 型録) [12] [[XML]] [[型録]]のほとんどの要素型 ([[名前空間名]]が [CODE(URI)[[[urn:oasis:names:tc:entity:xmlns:xml:catalog]]]] 及び [CODE(URI)[[[urn:oasis:names:tc:entity:xmlns:tr9401:catalog]]]] の全ての要素型。但し、 [CODE(XML)[[[rewriteSystem]]]], [CODE(XML)[[[rewriteURI]]]] 両要素型を除く。) では [CODE(XML)[xml:base]] 属性が使えます。 [13] 唯二つ使えない両要素型も、 URI 参照を値に持つ [CODE(XML)[[[rewritePrefix]]]] 属性を持っているのに [CODE(XML)[xml:base]] 属性が無いのは不可解です。 これらの両要素型の [CODE(XML)[rewritePrefix]] 属性、 仕様書本文中の定義では [CODE[uri-reference]] になっていますし、本文中の説明でも相対 URI はその場の基底 URI で解決することになっていますが、 [[DTD]] では URI 参照ではなく単なる文字列になっています。 [WEAK[(もちろん実際の型は [CODE(XML)[[[CDATA]]]] ですが、[[引数実体]]を使って型が擬似的に示してあります。あと、 DTD でなくても [[XML Schema]] も示してありますが、こちらも同じ状況です。)]] もしかしたら [CODE(XML)[rewritePrefix]] では URI としては不正な値 [WEAK[([SAMP(URI)[http://foo.]] とか。)]] も認めたかったから文字列型にしたのかもしれません。 でもなんだかなあ。 [[#comment]] ** 歴史 [7] XML Base は [[XLink]] と一緒に開発されたものの汎用性を持たせるべく独立した仕様となったそうです。 [[#comment]] ** メモ [9] XML 基底を使うとして、 [PRE(XML)[ ]PRE] の [SAMP(URI)[foo.css]] は [SAMP(URI)[dir2]] からの相対 URI として解釈されるのかな? (要素の内容だから。) [10] HTML で [PRE(HTML)[ ]PRE] は >>9 と同じように解釈されるのかなあ?? [31] [CITE[XInclude, xml:base, and validation]] [[XInclude]] の処理に伴って [CODE(XMLa)[[[xml]]:[[base]]]] [[属性情報項目]]が追加されると[[妥当性検証]]に影響がでかねないという問題 ([CODE(XMLa)[[[xml]]:[[lang]]]] でも)。 ([[名無しさん]]) [32] [CITE[2005 / 04 / 04: .NET developers want inconsistent schema validity on xml:* attributes?]] >>31 の問題で予想通り(藁) [CODE(XMLa)[[[xml]]:[VAR[*]]]] は[[妥当性検証]]で無視すればよいという意見が出ていることに対して、 それでは [CODE(XMLa)[[[xml]]:[[lang]]]] の値を制約したりできなくなるというおはなし。 ([[名無しさん]] [WEAK[2005-04-05 00:21:13 +00:00]]) [[#comment]] * base 要素型 (HTML, XHTML 1) [14] [[HTML]] の [DFN[[CODE(HTMLe)[base]] 要素型]]の要素は、 [[文書]]の[[基底URI]] や基底対象枠を指定するために使用することができます。 [17] HTML での基底 URI に関しては、 [[HTML//基底URI]] も参照してください。 [26] 仕様書: - [[HTML 2.0]] ([[RFC 1866]]) -- [CITE[5.2.2. Base Address: [CODE(HTMLe)[BASE]]]] - [[HTML 4]] -- [CITE[12.4 Path information: the [CODE(HTMLe)[BASE]] element]] [15] :[[開始タグ]]:必須 :[[終了タグ]] ([[HTML 2]], [[HTML 4]], [[ISO-HTML]]):禁止 :終了タグ (XHTML 1):必須 :[[内容模型]]:[[強制空要素]] :出現できる文脈:[CODE(HTMLe)[[[head]]]] 内の、参照を持つ要素の前に高々1個 :[[属性]]: ,属性名 ,値の型 ,既定値 ,意味 ,出典 ,[CODE(HTMLa)[[[href]]]] ,[[絶対URI]] ,(選択必須) ,基底 URI ,"[HTML 2], [HTML 4]" ,[CODE(HTMLa)[[[id]]]] ,(なし) ,固有識別子 ,"[XHTML 1.0 SE], Microsoft [[Word]]" ,[CODE(HTMLa)[[[target]]]] ,[CODE(SGML)[%[[FrameTarget]]]] ,(選択必須) ,既定の対象枠 ,[HTML 4] 非推奨 [CODE(HTMLa)[href]] 属性と [CODE(HTMLa)[target]] 属性のいずれかは必須です (が、 [[DTD]] でこれを表すことができないので、 両方の属性が存在する DTD では、両方省略可能になっています)。 [[#comment]] ** 出現できる文脈 [16] この要素は [CODE(HTMLe)[head]] 要素内に高々1個存在できますが [SRC[HTML 4]]、 外部参照を持つ要素の前になければなりません [SRC[HTML 4 仕様書]]。 [CODE(HTMLe)[base]] 要素の前に来得る、 外部参照を持ち得る要素型は [CODE(HTMLe)[[[script]]]], [CODE(HTMLe)[[[object]]]], [CODE(HTMLe)[[[link]]]] です。 (スクリプト内やスタイルシート内の参照も含まれるのでしょうか? だとしたら [CODE(HTMLe)[[[style]]]] 要素や、 [CODE(HTMLa)[style]] 属性または事象系属性を持つ任意の要素が該当します。) ところで、 [CODE(HTMLe)[head]] 要素自体も [CODE(HTMLa)[[[profile]]]] という値に [[URI]] を含む属性があります。でもそれ以前にもっていくのは不可能です。 [18] HTML 4 loose DTD でも [CODE(HTMLe)[base]] が出現可能なのは高々1回です。つまり、 [CODE(HTMLa)[href]] 用と [CODE(HTMLa)[target]] 用を別にするようなことはできない、 ということです。 [[#comment]] ** 他との関係 [27] HTML には [CODE(HTMLa)[[[codebase]]]] 属性があって、特定の要素の特定の処理における基底 URI を別途指定できます。 [[XHTML]] を他のマーク語彙と組合せる時の [CODE(HTMLe)[base]] 要素の影響は規定されていませんから、 どう解釈されるかわかりませんので危険です。 [[#comment]] ** 仕様書から *** RFC 1866 (HTML 2.0) 5.2.2. Base Address: BASE > The optional element provides a base address for interpreting relative URLs when the document is read out of context (see 7, "Hyperlinks"). The value of the HREF attribute must be an absolute URI. 省略可能な [DFN[[CODE(HTMLe)[base]] 要素]]は、 文書が文脈外で読まれる時に[[相対URL]]を解釈するための基底番地を提供します。 [CODE(HTMLa)[href]] 属性の値は[[絶対URI]]でなければなりません。 ** 不思議解釈 [8] [[不思議マーク付け]]的には、 [CODE(HTMLe)[base]] 要素は次の [CODE(HTMLe)[base]] 要素が現れるまで有効なのだそうです (少なくても [[WinIE]] はこの通り動くらしい)。 [CODE(HTMLe)[[[basefont]]]] 要素と同じですね。 [33] [[WinIE]] ([[MSHTML]]) において、 [CODE(HTMLe)[[[base]]]] 要素が [CODE(HTMLe)[[[head]]]] 中に存在する場合、 - [CODE(HTMLe)[[[body]]]] の [CODE(DOMa)[[[parentNode]]]] は [CODE(HTMLe)[[[base]]]] です。 - [CODE(HTMLe)[[[head]]]] 内の要素の内、 [CODE(HTMLe)[[[base]]]] の弟の [CODE(DOMa)[[[parentNode]]]] は [CODE(HTMLe)[[[base]]]] です。 - [CODE(HTMLe)[[[base]]]] の [CODE(DOMa)[[[childNodes]]]] には [CODE(HTMLe)[[[base]]]] の弟や [CODE(HTMLe)[[[body]]]] が含まれます。 - [CODE(HTMLe)[[[base]]]] の [CODE(DOMa)[[[parentNode]]]] は [CODE(HTMLe)[[[head]]]] です。 - [CODE(HTMLe)[[[base]]]] の [CODE(DOMa)[[[previousSibling]]]] は直近の兄です。 - [CODE(HTMLe)[[[base]]]] の [CODE(DOMa)[[[nextSibling]]]] は [CODE(DOM)[[[null]]]] です。 - [CODE(HTMLe)[[[head]]]] の [CODE(DOMa)[[[childNodes]]]] には [CODE(HTMLe)[[[base]]]] の兄や [CODE(HTMLe)[[[base]]]] が含まれます。 - [CODE(HTMLe)[[[body]]]] の [CODE(DOMa)[[[previousSibling]]]] は [CODE(HTMLe)[[[head]]]] です。 - [CODE(HTMLe)[[[body]]]] の [CODE(DOMa)[[[nextSibling]]]] は [CODE(DOM)[[[null]]]] です。 - [CODE(HTMLe)[[[head]]]] の [CODE(DOMa)[[[previousSibling]]]] は [CODE(DOM)[[[null]]]] です。 - [CODE(HTMLe)[[[head]]]] の [CODE(DOMa)[[[nextSibling]]]] は [CODE(HTMLe)[[[body]]]] です。 - [CODE(HTMLe)[[[head]]]] の [CODE(DOMa)[[[parentNode]]]] は [CODE(HTMLe)[[[html]]]] です。 - [CODE(HTMLe)[[[html]]]] の [CODE(DOMa)[[[childNodes]]]] には [CODE(HTMLe)[[[head]]]] と [CODE(HTMLe)[[[body]]]] が含まれます。 - [CODE(HTMLe)[[[base]]]] の [CODE(DOMa)[[[outerHTML]]]], [CODE(DOMa)[[[innerHTML]]]], [CODE(DOMa)[[[outerText]]]], [CODE(DOMa)[[[innerText]]]] には弟や [CODE(HTMLe)[[[body]]]] の内容も含まれます。 [CODE(HTMLe)[[[base]]]] の[[終了タグ]]はありません。 [CODE(HTMLe)[[[head]]]] の[[終了タグ]]は含まれます。 - [CODE(HTMLe)[[[head]]]] の [CODE(DOMa)[[[outerHTML]]]], [CODE(DOMa)[[[innerHTML]]]], [CODE(DOMa)[[[outerText]]]], [CODE(DOMa)[[[innerText]]]] には [CODE(HTMLe)[[[body]]]] の内容は含まれません。 ([[WinIE 6]] on [[Windows XP]] [[SP2]] で確認) 参考: [CITE[agenda 2002-03(下旬) - Personnel]] ([[名無しさん]]) [34] >>33 >>3 のように [CODE(HTMLe)[[[body]]]] 内に複数 [CODE(HTMLe)[[[base]]]] を入れてみると、それ以降がすべて [CODE(HTMLe)[[[base]]]] に飲み込まれます。 [CODE(HTMLe)[[[base]]]] の終了タグがあっても無視されます。 ([[名無しさん]] [WEAK[2005-05-29 07:33:55 +00:00]]) [35] >>34 のテスト: ([[名無しさん]] [sage]) [37] こういう変な包含関係は [CODE(HTMLa)@en[[[contentEditable]]]] でも生じるらしい [CITE@en[contentEditable - Anne’s Weblog about Markup & Style]] ([[名無しさん]] [sage]) [[#comment]] ** 歴史 [19] [CODE(HTMLe)[base]] 要素に [CODE(HTMLa)[[[id]]]] を振って、相対 URI を使う文脈でどの基底 URI (たとえば画像用の基底 URI) を使うのかを選べるようにしたらどうかという案もありました。 ''www-html@w3.org from May 1995: Re: processing by browsers'' [[#comment]] ** 例 [28] [PRE(HTML)[ Our Products

Have you seen our Bird Cages? ]PRE] [WEAK[(HTML 4 仕様書より、改)]] この場合、この文書自体の [[URI]] にかかわらず、 [CODE(HTMLe)[a]] 要素のリンク先は [SAMP(URI)[http://www.example.com/cages/birds]] になります。 [[#comment]] ** メモ [[#comment]] * メモ [36] [[P3P]] に[[基底URI]] を指定するための [CODE(XMLa)[base]] 属性があります。 ([[名無しさん]])