#?SuikaWiki/0.9 *xml:base 属性 (XML Base) [1] [[XMLBase]] は [[HTML]] の [CODE(HTML)[BASE]] 要素を汎用化して、 [[XML]] の任意の要素の属性として[[基底URI]] を指定できるようにしたものです。 XML Base を使う場合は、[[相対URI]]の解決は、 =その要素の [CODE(XML)[xml:base]] 属性の値 =その要素の親・先祖の [CODE(XML)[xml:base]] 属性の値 =上位プロトコルによる URI の値 により行われます。 この属性の値は、 -同じ要素の他の属性値 -子 [CODE(XML)[#text]] -子孫要素 -子孫[[処理命令]] に影響します。特に、 [CODE(XML)[xml:base]] 属性の値は''相対 URI でも構わない''ので、その解決にも使われます。 (逆に言えば、子孫の相対 URI の解決には先祖要素の [CODE(XML)[xml:base]] 属性を絶対 URI が得られるまで遡り続けないといけないということです。) [2] [CODE(XML)[xml:base]] 属性の値の定義は URI 参照ですから、 [CODE(URI)[#]] [[断片]]をつけても構いません。 (意味は無いですが。) URI に使えない文字が入っている場合は [[UTF-8]] にして [[escape]] し''ないといけません''。 (最初から非 URI 文字は含めてはならないと言ってしまえば良いのに、そうしないのはどうせ守らない人が出るのと、 [[IRI]] の絡みでしょうか。) [3] この属性自体は、 [[XML名前空間]]を使わない場合も使うことが出来ます。 また、 [[xml]] 名前空間は暗黙の宣言がなされていますから、 [[xmlns]]:xml 属性なしで使うことが出来ます。 [CODE(XML)[xmlns]] 系属性の値も [[URI]] 参照で、相対 URI の可能性があります (常識的な仕様とは思えません:))。 しかしこの URI は単なる識別子で、解決する必要があるものではありませんから、そのまま扱います。 但しその名前空間 URI をたどってみる場合には [CODE(XML)[xml:base]] 属性の値を使って解決するのも勝手だそうです。 [4] [[XHTML]] の使用については XML Base 仕様書は参考で曖昧なことを書いています。 実際のところ W3C の XHTML 1 の [[DTD]] にはこの属性は定義されていませんから、そのままでは使えません。 XHTML 2.0 [[WD]] では明確に使用できると定義されています。 [5] XML Base を使用できると明記していない仕様では、 XML Base 対応 [[UA]] と非対応 UA で挙動が異なることになるので無理して使用しない方が良いと思われます。 また、 [[XML基底]]仕様書にも注記がありますが、 [CODE(XML)[xml:base]] 属性に DTD や外部スキーマで初期値が設定されていると、[[妥当性]]を検証しない processor で正しい値が得られませんから、好ましくありません。 -''XML Base'' -''Errata in REC-xmlbase-20010627'' - [6] ''XML Base [日本語訳]'' : Errata 未反映なので注意 - [7] XML Base は [[XLink]] と一緒に開発されたものの汎用性を持たせるべく独立した仕様となったそうです。 [9] XML 基底を使うとして、 [PRE[ ]PRE] の [SAMP(URI)[foo.css]] は [SAMP(URI)[dir2]] からの相対 URI として解釈されるのかな? (要素の内容だから。) [10] HTML で [PRE[ ]PRE] は >>9 と同じように解釈されるのかなあ?? - [11] >>5 ですから、既定値は DTD の内部部分集合で指定するか、又は直接指定するべきだとされています。 (, ) [[#comment]] ** xml:base 属性 (型録) [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 でなくても [[XMLSchema]] も示してありますが、こちらも同じ状況です。)]] もしかしたら [CODE(XML)[rewritePrefix]] では URI としては不正な値 [WEAK[([SAMP(URI)[http://foo.]] とか。)]] も認めたかったから文字列型にしたのかもしれません。 でもなんだかなあ。 [[#comment]] ** メモ [[#comment]] * base 要素型 (HTML, XHTML 1) [14] [[HTML]] の [DFN[[CODE(HTMLe)[base]] 要素型]]は、 [[文書]]の[[基底URI]] や基底対象枠を指定するために使用することができます。 仕様書: [15] :[[開始タグ]]:必須 :[[終了タグ]]:禁止 ([[HTML4]] 以前, [[ISO-HTML]]) :[[内容模型]]:[CODE(XML)[[[EMPTY]]]] :[[親要素:[CODE(HTMLe)[[[head]]]] :[[属性]]: ,属性名,値の型,既定値,意味,出典 ,[CODE(HTMLa)[[[href]]]],[[絶対URI]],(選択必須),基底 URI,[HTML 4] ,[CODE(HTMLa)[[[target]]]],[CODE(SGML)[%[[FrameTarget]]]],(選択必須),既定の対象枠,[HTML 4] 非推奨 [CODE(HTMLa)[href]] 属性と [CODE(HTMLa)[target]] 属性のいずれかは必須です (が、 [[DTD]] でこれを表すことができないので、両方の属性が存在する DTD では、両方省略可能になっています)。 [16] HTML 4 仕様書・DTD によれば、この要素は [CODE(HTMLe)[head]] 要素内に高々1個存在できますが、 外部参照を持つ要素の前になければなりません。 [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]] を含む属性があります。でもそれ以前にもっていくのは不可能です。 [17] HTML での基底 URI に関しては、 [[HTML//基底URI]] を参照してください。 HTML には [CODE(HTMLa)[[[codebase]]]] 属性があって、特定の要素の特定の処理における基底 URI を別途指定できます。 [[XHTML]] を他のマーク語彙と組合せる時の [CODE(HTMLe)[base]] 要素の影響は規定されていませんから、 どう解釈されるかわかりませんので危険です。 [[#comment]] **メモ - [8] [[不思議マーク付け]]的には、 [CODE(HTMLe)[base]] 要素は次の [CODE(HTMLe)[base]] 要素が現れるまで有効なのだそうです (少なくても [[WinIE]] はこの通り動くらしい)。 [CODE(HTMLe)[[[basefont]]]] 要素と同じですね。 [[#comment]] * メモ