#?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 の内部部分集合で指定するか、又は直接指定するべきだとされています。 (, )
[20]
>>2 E03 によれば、妥当な URI 参照でない場合の処理は応用依存だそうです。
([[名無しさん]])
[[#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 でなくても [[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]]]] 内の、参照を持つ要素の前に高々1個
:[[属性]]:
,属性名 ,値の型 ,既定値 ,意味 ,出典
,[CODE(HTMLa)[[[href]]]] ,[[絶対URI]] ,(選択必須) ,基底 URI ,"[HTML 2.0], [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]] 要素の影響は規定されていませんから、
どう解釈されるかわかりませんので危険です。
[18]
HTML 4 loose DTD でも [CODE(HTMLe)[base]] が出現可能なのは高々1回です。つまり、
[CODE(HTMLa)[href]] 用と [CODE(HTMLa)[target]] 用を別にするようなことはできない、ということです。
([[名無しさん]])
[[#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]]]] 要素と同じですね。
[19]
[CODE(HTMLe)[base]] 要素に [CODE(HTMLa)[[[id]]]] を振って、相対 URI を使う文脈でどの基底 URI (たとえば画像用の基底 URI) を使うのかを選べるようにしたらどうかという案もありました。
''www-html@w3.org from May 1995: Re: processing by browsers''
([[名無しさん]])
[[#comment]]
* メモ