base

1. 基本情報

説明 相対参照の基準となる基底URIを指定する
語源 BASE uri
所属モジュール Base
所属コンテントセット なし
内容 なし
内容の書式 EMPTY
関連項目 head
公式な実装 DTD

2. 属性

2-1. 一般属性

属性 属性値の型 説明
xmlns URI (CDATA)

XMLネームスペースを指定します。XHTML 1.1では、常にhttp://www.w3.org/1999/xhtmlです。

2-2. 固有属性

属性 属性値の型 説明
href [必須] URI (CDATA)

相対参照の基準となる基底URIを指定します。

3. 解説

3-1. 概要

base要素は、相対参照を解決する (Resolve)時に使われる絶対URIを指定します。直感的な説明だけで良ければ、使用例を見るだけでいいでしょう。この文書では、ある程度厳密さを犠牲にしつつ、直感と厳密の間で簡単にURIの説明を加えます。

3-2. 絶対URI

絶対URI (Absolute URI)は、他に何ら情報を必要とする事無くリソースを完全に識別できるURI (Uniform Resource Identifier)から断片識別子 (Fragment Identifier)を除いたものです。厳密な説明は避けると、大体次のような形をしています(詳しくはUniform Resource Identifier (URI): Generic Syntax(RFC3986)の4.3. Absolute URIやHypertext Transfer Protocol -- HTTP/1.1(RFC2616)の3.2.2 http URLを参照の事)。

  1. http://www.w3.org/TR
  2. http://w4ard.s26.xrea.com:80/reference/xhtml11/
  3. http://w4ard.s26.xrea.com/program/search?keywords=Uniform+Resource+Identifier
  4. ftp://www.example.com/public/bin/apache
  5. urn:example:animal:ferret:nose

4のFTP (File Transfer Protocol)スキームを使ったURIや、5のURN (Uniform Resource Name)スキームを使ったURIは大きく本筋から逸れるので省略します。

絶対URIは、正規表現で次のように表す事ができます。

[プログラムコード開始]

absolute-URI ::= scheme ':' hier-part ( '?' query )?
hier-part ::= ( '//' authority path-abempty | path-absolute | path-rootless | path-empty )
authority ::= ( userinfo '@' )? host ( ':' port )?

[プログラムコード終了]

厳密さを犠牲にしてさらっと説明します。

scheme

スキーム。リソースを入手する手法。HTTP (HyperText Transfer Protocol)を使う場合、httpのみが取り得る値。

host

ホスト。リソースの保持者を識別するもの。例えば、W3C (World Wide Web Consortium)のサーバならwww.w3.org、XREAの26番目のサーバにあるw4ardという名前のバーチャルサーバならw4ard.s26.xrea.com

port

ポート。ここでは、繋ぐサーバのポート。portが空か、コロンごと省略されている時は80だと見なされる。

path

パス。リソースの位置を表すもの。path-abemptyは絶対パスか空のパス、path-absoluteは絶対パス、path-noscheme(後述)はコロンを含まないセグメントから始まるパス、path-rootlessはセグメントから始まるパス、path-emptyは空のパス。

segment

セグメント。パスの構成要素。空でもいいし、適当な長さの文字列でも良い。大抵エンティティ名(ディレクトリ名かファイル名)、しばしばエイリアス、時々識別子、稀にその他。

query

クエリ。クエリ文字列。サーバーサイドのプログラムなどから利用できる。クエスチョンマークごと省略できる。

3-3. URI参照

URI参照 (URI Reference)は、リソースの識別子を示す時に最も広く使われているものです。 URIデータタイプは「リソースのURI」となっていますが、実際にはURI参照の事です。URI参照はURIを参照する手段で、URI構文で表されるURIそのものか、relative-ref構文で表される相対参照の何れかです。

[プログラムコード開始]

URI-reference ::= ( URI | relative-ref )
URI ::= scheme ':' hier-part ( '?' query )? ( '#' fragment )?

[プログラムコード終了]

URI構文は、absolute-URIの末尾に'#'と断片識別子を付け加える事ができます。relative-ref相対参照で説明します。

3-4. 相対参照

相対参照 (Relative Reference)は、階層構造の利点を活かして、別のリソースを表現するものです。RFC2396では相対URI (Relative URI)部分URI (Partial URI)などという用語が使われていましたが、それがURIを参照する方法ではなく、URIのサブセット(部分集合)だと誤解される事があった為に、RFC3986では単に相対参照と呼んでいます。

NOTE: Previous specifications used the terms "partial URI" and "relative URI" to denote a relative reference to a URI. As some readers misunderstood those terms to mean that relative URIs are a subset of URIs rather than a method of referencing URIs, this specification simply refers to them as relative references.

相対参照はURIに似ていますが、schemeの指定がありませんし、path-rootlessの代わりにpath-noschemeを持ち得ます。なお、繰り返しますが、相対参照はURIを参照する方法であって、URIそのものではありません

[プログラムコード開始]

relative-ref ::= relative-part ( '?' query )? ( '#' fragment )?
relative-part ::= ( '//' authority path-abempty | path-absolute | path-noscheme | path-empty )

[プログラムコード終了]

また、厳密な説明はRFC3986をご覧下さい。ここでは例を挙げるに留めます。なお、'.'、'..'はドットセグメント (Dot-segment)として知られ、ファイルシステムにおけるカレントディレクトリ、ペアレントディレクトリとほぼ同等です。

  • //www.w3.org/1999/xhtml - '//' authority path-abemptyの形式。使われるのは稀
  • /reference/xhtml11/element/base - path-absolute形式
  • form - path-noscheme形式。同階層のformを参照する
  • ./form - path-noscheme形式。同じく同階層のformを参照する
  • ../how-to - path-noscheme形式。親階層のhow-toを参照する
  • ../../ - path-noscheme形式。親階層の親階層を参照する; 大抵その階層のデフォルトドキュメントが取得できる
  • - path-empty形式。空っぽ。長さ0の文字列。自分自身を指すが、これだけでは滅多に使われない
  • #heading.3 - path-empty '#' fragmentの形式。同じ文書中の断片識別子によって指される要素を参照する
  • /search?keywords=URI - path-absolute '?' queryの形式
  • ../show?hash=ENV#HTTP_REFERER - path-noscheme '?' query '#' fragmentの形式

3-5. 基底URI

ここからが本題です。相対参照が結局どのURIを参照しているのかを見つける事を、前述の通り解決する (Resolve)と言います。相対的なものは、基準が定まって初めて絶対的な位置を定義できるように、断片識別子のみの参照(例えば#heading.1)以外の相対参照は、その基準となる基底URI (Base URI)が定まっている時にしか安心して使う事ができません。base要素は、相対参照を解決する時に使われる文書の基底URIを確立する (Establish)時に介入します。

3-6. 基底URIの確立

基底URIは、優先順位の高い方から順に、次のようなものから確立されます。

  1. 文書中に埋め込まれた基底URI
  2. 内包するエンティティの基底URI
  3. 取得に使われたURI
  4. デフォルトの基底URI

3-6-1. 文書中に埋め込まれた基底URI

正にbase要素の事です。href属性でURI参照(但し、相対参照では駄目で、絶対URIでなければならない)を指定する事で、文書中に効果の及ぶ基底URIを指定できます。

但し、object要素data属性で埋め込まれる文書には影響しません。埋め込まれる文書は一見文書の一部に見えますが、描画以外では完全に独立しています。

また、object要素の中では例外的にcodebase属性がより高い優先順位を持ちます。

3-6-2. 内包するエンティティの基底URI

エンティティ (Entity。実体)は、ここでは識別子 (Identifier)とその他の環境要因によって実際に示されたもの、と考えればよいでしょう。例えばimage.png、image.gifを同じ階層に置き、ウェブサーバでコンテントネゴシエーションを有効にした場合、識別子imageで示されるエンティティは環境要因に左右されます。GIFイメージはサポートするけれどもPNGイメージは描画できないユーザーエージェントは、同じ内容のイメージなら、できるだけGIFイメージを返してくれるようサーバに要求します。サーバはこれにimage.gifを返します。エンティティはimage.gifです。一方、PNGイメージもGIFイメージもサポートするユーザーエージェントは、どちらでも受け付けるけれども、(恐らく)優れたPNGイメージを優先してくれとサーバに要求します。これに対してサーバはimage.pngを返します。エンティティはimage.pngです。

尤も、「内包するエンティティ」の「エンティティ」はイメージの事ではなく、例えばHTTPメッセージやアーカイブファイルなどです。XHTML文書を幾つか格納するアーカイブがあった時、格納されている個々のXHTML文書が文書中に基底URIを埋め込んでいなければ、アーカイブ自体の基底URIが個々のXHTML文書の基底URIになります。アーカイブ自身の基底URIは、同じように確立されます。

大抵の場合、つまりXHTML文書が単体で存在している時、このステップは飛ばされます。

3-6-3. 取得に使われたURI

XHTML文書の取得にURIが使われた場合、そのURIが基底URIと見なされます。例えば、この文書(http://w4ard.s26.xrea.com/reference/xhtml11/element/base)はbase要素も使っていないしアーカイブなどに内包されている訳でもないので、基底URIはhttp://w4ard.s26.xrea.com/reference/xhtml11/element/baseになります。

文書を取得するまでの過程の中でリダイレクトが使われた場合、最後のURI、即ちリソースを実際に取得するのに使われたURIが基底URIになります。

3-6-4. デフォルトの基底URI

上記の何れのステップでも基底URIを確立できなければ、完全にアプリケーションに依存するデフォルトの基底URIを使う事になります。これは、同じ内容なのに、扱うアプリケーションによって異なる解釈がされる恐れがあるので、できる限り避けるべきです。

こういう状況は、電子メールに埋め込まれた文書などで起こり得ます。文書の作成者は、こういった事が起こらないようにきちんと配慮すべきです。他のステップで基底URIが確立できない時に唯一安心して使えるのは、前述の通り断片識別子のみによる参照(例えば#heading.1)だけです。

3-7. 相対参照の解決

URIを解釈するプログラム用の解説ではないので、変形 (Transformation)ドットセグメント除去 (Removing Dot-segments)再構成 (Recomposition)後の例を示すに留めておきますが、相対参照の解決は次のように行われます。

基底URIがhttp:で相対参照が//www.w3.org/TRの時

基底URIからschemeを、相対参照からauthoritypathを取って、http://www.w3.org/TR

基底URIがhttp://www.w3.orgで相対参照がTRの時

基底URIからschemeauthorityを、相対参照からpathを取って'/'で繋ぎ、http://www.w3.org/TR

基底URIがhttp://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が//www.w3.org/TR/2001/REC-xhtml11-20010531の時

基底URIからschemeを、相対参照からauthoritypathを取って、http://www.w3.org/TR/2001/REC-xhtml11-20010531。相対参照がauthorityを持っている場合は、基底URIからはschemeしか取られない。

基底URIがhttp://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が/stylesheet/commonの時

基底URIからschemeauthorityを、相対参照からpathを取って、http://w4ard.s26.xrea.com/stylesheet/common。相対参照のpathが絶対パスであれば、基底URIのpathは無視される。

基底URIがhttp://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が./element/の時

基底URIからschemeauthorityを取り、基底URIのpathと相対参照のpathをマージして、http://w4ard.s26.xrea.com/reference/xhtml11/element/

基底URIがhttp://w4ard.s26.xrea.com/reference/xhtml11/how-toで相対参照が../の時

基底URIからschemeauthorityを取り、基底URIのpathと相対参照のpathをマージして、http://w4ard.s26.xrea.com/reference/

基底URIがhttp://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が?queries#fragmentの時

相対参照のpathが空なので、基底URIからschemeauthoritypathを取り、相対参照のqueryfragmentを取って、http://w4ard.s26.xrea.com/reference/xhtml11/?queries#fragment

基底URIがhttp://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が../program/search?queriesの時

基底URIからschemeauthorityを取り、基底URIのpathと相対参照のpathをマージし、相対参照のqueryを取って、http://w4ard.s26.xrea.com/reference/program/search?queries

変形については、RFC3986の5.2.2. Transform Referencesに擬似コードで厳密なアルゴリズムが紹介されています。

3-8. 使用例

尤も、URIはそんなにRFC3986とにらめっこしなくても、直感的に理解できます。

例えば、次の目次として使われている文書がhttp://www.example.com/software/smart-finder/toc.htmlというURIで表される場合を考えてみましょう。

[プログラムコード開始]

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>目次</title>
<link rel="stylesheet" type="text/css" href="./manual/special.css"/>
</head>
<body>
<ol>
<li><a href="./manual/introduction.html">本ソフトウェアの概要</a></li>
<li><a href="./manual/setup.html">インストール・アンインストール</a></li>
<li><a href="./manual/common-usage.html">基本的な使い方</a></li>
<!-- ……後続の目次項目…… -->
</ol>
</body>
</html>

[プログラムコード終了]

この文書で使われている相対参照は、./manual/以下のリソースばかりを指しています。そこで、<base href="http://www.example.com/software/smart-finder/manual/"/>相対参照が現れる前に head要素の子に追加する事で簡略化します。

[プログラムコード開始]

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>目次</title>
<base href="http://www.example.com/software/smart-finder/manual/"/>
<link rel="stylesheet" type="text/css" href="./special.css"/>
</head>
<body>
<ol>
<li><a href="./introduction.html">本ソフトウェアの概要</a></li>
<li><a href="./setup.html">インストール・アンインストール</a></li>
<li><a href="./common-usage.html">基本的な使い方</a></li>
<!-- ……後続の目次項目…… -->
</ol>
</body>
</html>

[プログラムコード終了]

<base href="http://www.example.com/software/smart-finder/manual"/>(スラッシュが落ちている)とやらないように気を付けて下さい。パフォーマンスの問題の前に、ドットセグメント('.'や'..')の除去の段階で異なる解釈をされます。

[base]
Published : 2006-03-26T09:00:00+09:00
Last Modified : 2007-04-29T18:24:06+09:00
Table of Contents : 要素目次
Index : 要素索引
Verified with : Valid XHTML 1.1
Copyright © 2006 - 2007  E+X.