この章では、SGMLの概要と、SGMLとHTMLの関係とについて、説明します。SGMLについて完全な理解を得たい方は、国際標準規格そのもの([ISO8879])をお読み下さい。
SGML [Standard Generalized Markup Language] とは、マークアップ言語markup languagesを定義するための国際標準規格です。電子文書を作る場合に、構造、表示方法、意味、などの側面から目印をつけていく [マークアップmark upする] 方法がありますが、HTMLはそうしたマークアップ言語の1種です。ではHTML文書の例を見ましょう。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <HTML> <HEAD> <TITLE>はじめてのHTML</TITLE> </HEAD> <BODY> <P>こんにちは! </BODY> </HTML>
HTML文書の構造は、ヘッド部(<HEAD>と</HEAD>で囲まれた部分)と、ボディー部(<BODY>と</BODY>で囲まれた部分)に分けられます。 文書の表題はヘッド部に(他の情報と共に)記され、実際の文書の中身はボディー部に記されます。この例では本文は「<P>」から始まるただ1段落のみとなっています。
SGMLで定義されたマークアップ言語は、「SGMLアプリケーションSGML application」と呼ばれます。SGMLアプリケーションには一般的に次のようなものが含まれています。
このHTML 4.0 の仕様書には、SGML宣言と、3種類の文書型定義(7章のHTMLのバージョン情報(HTML version information)の節を参照のこと)と、文字参照一覧とが記載されています。
以下の節では、HTMLで用いられているSGML構造体について説明します。
附記Bには、HTML規格やユーザエージェントがあまりサポートしておらずまた使用を避けるべきであるようなSGMLの機能<SGML features>をリストアップしてあります。
SGMLの文書型定義は、マーク付けに用いる要素について、構造や動作などの要素型<element type>を宣言するものです。HTMLには、段落を表す要素や、ハイパーリンクを表す要素、リストの要素、表の要素、画像の要素、等々があります。
各々の要素型宣言は、たいてい、次の3つを1組にして記述されます。すなわち、「開始タグ」「内容」「終了タグ」です。
要素の名前は開始タグの部分に (<要素名>のように [小なり記号と大なり記号で挟んで])書かれ、また終了タグにも (</要素名>のように [更にスラッシュ記号を付加されて])記されます。終了タグでは要素名の直前にスラッシュ記号が書かれることにご注意下さい。例えば、UL要素の開始タグと終了タグは、リストアップされる内容がどこからどこまでであるかを次のように表します。
<UL> <LI><P>...リスト項目1... <LI><P>...リスト項目2... </UL>
要素の幾つか(例えばP要素やLI要素など)は終了タグの省略が可能です。更に開始タグまでもが省略可能なものもあります。例えば HEAD要素やBODY要素などは開始タグも省略可能です。HTMLのDTDの中では、全ての要素に関し、開始タグと終了タグの要不要が記されています。
要素の中には、含むべき内容を持たないものもあります。例えば、行端を表すBR要素には、内容部分が付随しません。これは行の終わりを示すためだけに存在する要素です。空要素と呼ばれるこうした要素には、終了タグが存在しません。 文書型定義および仕様書本文では、どの要素が空要素なのか、あるいは内容を持てるのか、どんなデータ形式が内容として相応しいのか、といったことを記しています。
要素名の表記には大文字小文字を区別しません。
要素を統括するルールについては、SGML標準をご確認下さい。(例えば、入れ子にする時は内外の順序を正確に並べる必要があるとか、開始タグと終了タグが正しい組になっているかどうかや、省略可能な終了タグのみが不在になっているのかどうか等(第7章5$B@a1項等を参照のこと)。)[訳注。正誤表に基づき修正済み。]
例えば、次のように表された第一段落は、
<P>これは第一段落です。</P> ...次のブロック要素...
下記のように終了タグの省略が可能です。
<P>これは第一段落です。 ...次のブロック要素...
なぜなら、次のブロック要素が始まることによって、<P>開始タグが [文章構造上] 閉じられているからです。同様に、段落がブロック要素内の一部であるような場合、
<DIV> <P>ここは段落です。 </DIV>
ブロック要素の終了タグ(「</DIV>」)の存在によって、段落の開始タグ「<P>」もまた [文章構造上] 閉じられているというわけです。
要素とは、タグのことではありません。要素のことをタグと呼んでいる人(例えば「Pタグ」などと言う人)もいるでしょう。けれども要素とタグとは(開始タグにせよ終了タグにせよ)別の物です。例えばHEAD要素の場合、文書中に開始タグと終了タグの双方が存在しなくても、HTML文書である限りHEAD要素自体は常に存在します。
この仕様書が定める全ての要素は、要素一覧に記載されています。
要素には、属性と呼ばれる、ある質・量の値を持った付録が伴う場合があります(属性の値は、仕様の既定値の場合もあれば、書き手の指定値の場合もあります)。属性・値は、その要素の開始タグの閉じ括弧「>」の内側に記されます。個々の要素が取りうる文法的に正しい属性・値であれば、開始タグの内側に、空白文字で区切って何組でも順不同で並記することができます。
SGMLの表記法では、全ての属性値は二重引用符(「"」: ASCIIコード34)または単引用符(「'」: ASCIIコード39)で囲む必要があります。単引用符は、属性値全体が二重引用符で囲まれる場合には属性値の一部分として用いることも可能ですし、逆に単引用符で囲んだ属性値の一部として二重引用符を使うこともできます。各引用符を表すのに、数値文字参照によって、二重引用符なら「"」、単引用符なら「'」を用いることもできますし、二重引用符の場合には文字実体参照によって「"」と表記することもできます。
属性値を書き入れる際に引用符を用いる必要がない場合もあります。アルファベット(a-zとA-Z)、数字(0-9)、ハイフン(「-」ASCIIコード45)、そしてピリオド(「.」ASCIIコード45)のみで記される値の場合です。けれども本仕様では、このように省略可能な場合でも引用符で囲んでおくことを推奨します。
属性名は大文字で記しても小文字でも構いません(case-insensitive)。
属性値の大半も大文字で記しても小文字でも構いません(case-insensitive)。各属性の定義部分には、個々の属性値が大文字小文字を区別するかどうかが並記してあります。
この仕様書で定義されている全ての属性は、属性一覧に掲載されています。
文字参照とは、HTML文書中に使用できる文字の1つ1つに対応する数値あるいは名称のことです。珍しい文字を使用する場合や、HTMLオーサリングツールで入力できないような文字を使用する場合などに有用です。この文書の本文中にも、アンパサンド記号「&」で始まりセミコロン記号「;」で終了する、文字参照が使われています。一般的な例は、次のようなものです。
これら文字参照の詳細については、第5章HTML文書の表現にて記します。また、この仕様にはHTML 4.0で使用可能な文字参照の一覧も別途含まれています。
HTMLでのコメントの表記法は、次の通りです。
<!-- ここはコメントです。 --> <!-- これもまたコメントで、 複数の行にまたがっているものです。 -->
マークアップ宣言開始区切り子(「<!」)とコメント開始区切り子(「--」)の間には、空白文字の挿入は許されません。けれどもコメント終了区切り子(「--」)とマークアップ宣言終了区切り子(「>」)の間には、空白文字の挿入が許されます。よくある間違いに、コメント中に連続したハイフンを入れること(「---」など)があります。コメント中に2個以上連続するハイフンを用いることは、避けねばなりません。
コメント文中に記載される情報は、マークアップ言語としては何等特別な意味を表しません。(例えば、文字参照があっても解釈されません。)
[ 訳注。上記で言う「空白文字」は、第9章1節で言う「空白文字」を意味するそうです。]
この仕様書の中に記されている、どの要素、どの属性の定義文にも、それを表している文書型定義の抜粋が並記してあります。いちいちDTD全体の中から該当の個所を探し出すよりいいだろうとの考えからです。以下の手引きは、SGMLに馴染みのない方のためにDTDの読み方を説明し、HTML定義の詳細を理解する手がかりを提供しようとするものです。
DTDには、1行ないし複数行のコメントが記されます。DTD中のコメントは、前後を「--」のペアで区切られます。例えば次のように。
<!ELEMENT PARAM - O EMPTY -- named property value -->
上記のコメント「named property value」は、PARAM要素の内容たりうるデータ形式について説明したものです。DTD中のコメントは、[規範ではなく] 参考としてのみ記されます。
HTMLのDTDは、パラメータ実体の定義から始まります。パラメータ実体定義は、他の要素や属性などの定義文から参照される、一種のマクロとして使われます。ただしHTMLとしては使用できず、DTDの中だけで機能するマクロです。別のマクロとも考えられる文字参照の方は、HTML文書の本文の記述やHTMLの属性値として使用できます。
DTDにおいてパラメータ実体が名前で参照されると、それは文字列に展開されます。
パラメータ実体の定義は、「<!ENTITY %」というキーワードに続けて、実体名、引用符で括った展開文字列、最後を「>」で閉じる、という形になります。DTD中に現れるパラメータ実体インスタンスは、「%」、「名称」、「;」の順に組み合わされて記されます。
下記は、「%fontstyle;」という実体の展開文字列を定義した例です。
<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
あるパラメータ実体を定義する部分に、別のパラメータ実体が使われる場合もあります。下記の例では、「%inline;」というパラメータの定義に「%fontstyle;」「%phrase;」「%special;」「%formctrl;」というパラメータ実体が使われています。
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
HTMLのDTDには「%block;」というパラメータ実体と「%inline;」というパラメータ実体が頻繁に出てきます。内容モデルがブロックレベルの要素を含み持つものなのか、インラインの要素を含み持つものなのかを表すパラメータ実体です。(この両者の違いについては、HTML文書の大枠構造を記す第7章で説明します。)
HTMLのDTDの大部分は、個々の要素の形式やその属性の定義文から成り立っています。「<!ELEMENT」というキーワードで要素の定義書式である要素宣言が始まり、大なり記号「>$B!W$GMWAG@k8@$O=*$o$j$^$9!#$=$N4V$K!"
例えばこの例の見方は次のようになります。
<!ELEMENT UL - - (LI)+>
下記は、空要素の宣言を説明するものです。
<!ELEMENT IMG - O EMPTY>
内容モデルの定義には、個々の要素にどんな内容が含まれうるかが記されています。内容モデルの定義には次のようなことが書かれます。
個々の要素の内容モデルの定義は次のように記されます。
ではHTMLのDTDから幾つか例を拾ってみましょう。
<!ELEMENT UL - - (LI)+>
<!ELEMENT DL - - (DT|DD)+>
DL要素の内容には、1つ以上のDT要素かDD要素が(順不同で)必要です。
<!ELEMENT OPTION - O (#PCDATA)>
OPTION要素には、通常の文であれ「&」のようなエンティティであれ、どちらでも記述できる、ということが、SGMLのデータ形式「#PCDATA」によって示されています。
HTML要素の中には、内容モデルの記述のために、特定要素を除外するためのSGML表記法が用いられているものもあります。除外される要素は、ハイフンを先頭につけて表されます。除外すると明示された内容は、内容モデルに含まれるという記述を上書き的に補完するものです。
次の例の-(A)は、A要素の内容モデルに別のA要素が現れてはいけないことを表しています。(つまり、アンカーは入れ子にはできません。)
<!ELEMENT A - - (%inline;)* -(A)>
この定義文で注意が必要なのは、A要素DTDのパラメータ実体「%inline;」の一部ですが、「-(A)」という指定によって除外が明示してあるという点です。
同様に、下記のFORM要素の定義でも、入れ子が禁じられています。
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>
「<!ATTLIST」というキーワードで始まるのは、要素が取りうる属性に関する定義書式である属性宣言です。キーワードに続いて対象となる要素の名前が記され、次に属性に関する定義文が続き、最後に「>」で閉じられます。どの属性の定義も、次の3つを1組にして記されます。
下の例では、name属性がMAP要素に対して定義されています。この要素に対しては省略可能な属性です。
<!ATTLIST MAP name CDATA #IMPLIED >
この例では内容モデルのデータ形式がCDATAと書かれています。これはSGMLの表記法で、文字参照を含む一般の文・字のことを表します。
データ形式として記される「CDATA」「NAME」「ID」等々については、別途HTMLの基本データ形式を記した第6章をご参照下さい。
下記は複数の属性を一度に定義しているものです。
rowspan NUMBER 1 -- number of rows spanned by cell -- http-equiv NAME #IMPLIED -- HTTP response header name -- id ID #IMPLIED -- document-wide unique id -- valign (top|middle|bottom|baseline) #IMPLIED
rowspan属性は属性値のデータ形式としてNUMBERすなわち数値が指定されています。既定値は「1」となっています。次のhttp-equiv属性の値にはNAME形式が、その次のid属性の値にはID形式が指定されています。最後のvalign属性の場合、「top」「middle」「bottom」「baseline」の4つのうちどれかが属性値となります。
属性の定義文には、パラメータ実体参照が用いられる場合もあります。
次の例はLINK要素に対する属性定義の一覧で、「%attrs;」というパラメータ実体参照が用いられています。
<!ELEMENT LINK - O EMPTY -- a media-independent link -->
<!ATTLIST LINK
%attrs; -- %coreattrs, %i18n, %events --
charset %Charset; #IMPLIED -- char encoding of linked resource --
href %URI; #IMPLIED -- URI for linked resource --
hreflang %LanguageCode; #IMPLIED -- language code --
type %ContentType; #IMPLIED -- advisory content type --
rel %LinkTypes; #IMPLIED -- forward link types --
rev %LinkTypes; #IMPLIED -- reverse link types --
media %MediaDesc; #IMPLIED -- for rendering on these media --
>
開始タグ: 必要、終了タグ: なし。
パラメータ「%attrs;」は、次のように定義されています。
<!ENTITY % attrs "%coreattrs; %i18n; %events;">
パラメータ実体「%attrs;」の定義に用いられている別のパラメータ実体「%coreattrs;」の定義内容は次の通りです。
パラメータ実体「%attrs;」は、この属性が多くのHTML要素に対して付加される属性であるため、対象要素の定義を簡略化するために、別途定義されているものです。
同様に、「%URI;」というパラメータ実体は、「CDATA」型文字列として解釈されます。
上の例は、パラメータ実体「%URI;」がDTD中に現れた場合、属性のデータ形式に関するより詳しい情報を提供するものであることを意味しています。同様の定義が「%Color;」「%Charset;」「%Length;」「%Pixels;」等々に対しても行われています。
属性の中には、論理式を表すブール代数のような役割を果たすものもあります。(例えば、OPTION要素に対して指定されるselected属性など。)ある要素の開始タグ中に論理型の属性名が記されていれば、その属性値が「真」であることを意味し、属性名が記されていなければ、その属性値が「偽」であることを意味するというわけです。
論理型の属性は、ただ1種類の値、すなわちその属性の名前自身を属性値として要求します。(例えば、「selected="selected"」というように。)
下記は、論理型属性としてのselected属性の定義文です。
selected (selected) #IMPLIED -- reduced inter-item spacing --
この属性の値は、ある要素の開始タグ中に記されることで「真」となります。[訳注。正誤表に基づき例文を修正済み。]
<OPTION selected="selected"> ...この要素に含まれる内容... </OPTION>
HTMLの表記では、論理型の属性は属性名を省略した最小型すなわち値のみで記すことができます。そこで、実際にselected属性は次の後者のように書くよりは前者のように書かれるでしょう。
<OPTION selected>
<OPTION selected="selected">
多くのユーザエージェントは論理型の属性に関して省略抜きの記述ではなく最小化された記述だけしか理解できなかったりする、ということに、ご注意下さい。