Section 11 : SGML としての HTML(2)

 ここでは,HTML を含めた SGML のキーワードになる,要素・属性およびタグについてまとめよう。

要素・属性とタグ

 DTD では,SGML アプリケーション(ここでは HTML)で用いられる要素が定義される。要素の存在は,ドキュメント中でタグを用いて明示的に示される。

 要素は,開始タグと終了タグを持ち,“ここから〜ここまで”のかたちで記述されるものと,1個のタグだけで“ここに”と記述されるもの(エンプティ要素)とに分けられる。後者は,いわば終了タグを書いてはいけない要素である。前者は開始タグと終了タグの間にその内容をとることができ(または,とらなければならず),何を内容とすべきかは DTD に示されている。または,規格書中で補足されている。後者は,内容を持たない。“ここに”のかたちで表される要素は,DTD 中で EMPTY というキーワードで示されている。

“終了タグをとってはいけない要素”と“中身が空の‘ここから〜ここまで’で示す要素”は,厳密には両方エンプティ要素だが,本チュートリアルでは,便宜上,前者を“エンプティ要素”,後者は“中身が空の要素”と呼び分けることにする。

 属性は要素の性質を指定するために開始タグに記述される。属性は“(属性)=(値)”のかたちが原則だが,SGML 宣言によって値から属性名が自明なときは値だけで構わないとされることもある。HTML においては,このような属性の与え方は許されてはいるものの,UA の解釈の問題で,yes/no のブール値を与える属性と,とくに HTML 4 では <TABLE>FRAME="border" のみがこの書式をとることになる。このとき,ブール値を与える属性は属性名を書くと(省略しない書き方をすると)逆に UA に認識されない可能性が大きいので注意したい(これは,UA の実装ミスである)。

 属性値として何をとるか,属性が必須であるかどうか,省略可の場合は省略時どのように振る舞うかは DTD に書かれ,仕様書で補足されている。

 DTD によって,タグは,終了タグ,または開始タグと終了タグの両方を省略してよいとされることがある。タグの省略は,通常,前後関係からタグのあるべき位置が自明であるような場合に限られる。

 たとえば,箇条書き <UL> では,その内容となるものが <LI> のみのため,終了タグ </LI> がなくても次の項目の開始タグ <LI> 直前に終了タグがあることは容易に推測できる。

 また,開始タグも終了タグも省略できる要素があるということは,タグによって要素の存在が明示的に示されるが,必ずしも要素の存在にタグは必要ないことを意味している。つまり,要素とタグとは別のもの(さらに言うと,タグは要素の一部)である。ことばの問題ではあるが,“タグ”が“要素”を表している書籍や WWW 上のガイドは多いのが現状である

 SGML においては,このほかにもさまざまな省略や記述が用意されているが,これらを用いると UA においての出力が正常になされないことが多い。たとえば,<?...> というかたちで記述される SGML のデバイス依存の命令(プロセシングインストラクション:たとえば,印刷時には改ページせよ,など構造に関係ない命令)は,本来表示させてはいけないものであるが,UA によっては表示されてしまうこともある。HTML を編集するのに SGML エディタを用いる場合には,このような点に注意する必要がある。HTML は SGML アプリケーションであるが,現実的には不完全なものにされた側面も否めない。

文字参照

 Try next HTML の Section 6 では,&...; のかたちで文字を表現する文字実体参照を紹介した。

 文字の参照は実体参照だけでなく,コードによる参照も可能である。これは,HTML を書いた文字コード・セットにある以外の文字を入力する場合に用いることがある。たとえば,文字コードセットがシフト JIS のときに,ハングルを直接入力するのは困難である。こんなときに,コードでハングル文字を参照する(ただし,ハングルが表示できない,扱えない環境では表示されないのはしかたがない)。

 数字による文字参照は &#...; で,10進数の数値あるいは x に続けて 16進数の数値を書いて指定を行う。数字によって参照する場合は,大文字と小文字は区別されない。このとき数値として指定するのは Unicode 中の番号であって,その文書中での文字コードセットにおける番号ではない。たとえば,“日”という文字はシフト JIS では 93FA(16進)だが,Unicode においては 65E5(16進)である。したがって,もし“日”がコードで参照される場合,&#x65e5; となる。

 Unicode には,テキストの流れる向きを制御する文字が含まれていて,<BDO> で実現するフィーチャーを文字単位というもっとプリミティブな方法で実現できる。

 しかし,世界中の環境がすべての文字を表示できるとは限らないことはよくおわかりのはずである。たとえ,直接入力できない文字を文字参照で出力させようとしたところで表示できない可能性のほうが高いかもしれない。こんなときに <IMG> を使うことを考えたい。多少ページのサイズは大きくなってしまうかもしれないし,レイアウトもうまくいかなくなるかもしれないが,出力させたい文字を“表示”させるにはかなり確実な方法である。

 また,文字参照をするにあたって気をつけるべき点がある。HTML ファイル中の非 HTML の部分(スタイルシート,スクリプトなど)には,文字参照は適用される場合と,されない場合がある。

 スクリプトの場合を用いて話を進めるが,これが属性値となっているときには文字参照を用いる。たとえば JavaScript で

if (a < 0) { ... }

を属性値として書く場合,不等号は参照されなくてはならない。

if (a &lt; 0) { ... }

だが,<SCRIPT>...</SCRIPT> に書かれた場合には,参照せず,“<”のまま記述する。

 要するに,文字参照は非 HTML データを記述する属性では用いるが,要素では用いない。

 ちなみに,文字参照の最後のセミコロン「;」は,どこまでが参照であるかが自明なときは省略しても構わないことになっているが,UA が正しく扱わない可能性もあるので,省略は避けるようにしたい。