目次
この節では、SGMLの解説を行うと共に、SGMLとHTMLとの関係について説明する。 SGMLの完全な説明は、SGML標準 ([ISO8879])に委ねる。
SGMLは、マーク付け言語を定義するためのシステムである。 著者は、著述する文書を、内容の構造、プレゼンテーション、セマンティクス情報などを表すように マーク付けする。 HTMLはマーク付け言語の一例である。HTML文書の例を示そう。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <HTML> <HEAD> <TITLE>はじめてのHTML文書</TITLE> </HEAD> <BODY> <P>Hello world! </BODY> </HTML>
1つのHTML文書は、ヘッダの部分 (<HEAD> と </HEAD>の間) 及び本体の部分 (<BODY> と </BODY>の間)に分けられる。文書の表題は、当該文書に関する他の情報と共にヘッダに出現し、文書の内容は本体に出現する。 この例では、本体に段落が1つだけ含まれ、 <P>でマーク付けされている。
SGMLで定義されるマーク付け言語はどれも、SGMLアプリケーションと呼ばれる。 SGMLアプリケーションは一般的に次の特徴を持つ。
本仕様には、1つのSGML宣言、3つの文書型定義 (この3つの説明はHTMLバージョン情報の項を参照されたい)、そして文字参照の一覧が含まれている。
以下の各節では、HTMLで利用されているSGML構成素について概説する。
附属書では、HTMLツールやユーザエージェントでは広くサポートされておらず、使用を避けるべきSGML機能について、列挙する。
SGMLの文書型定義は、構造あるいは望ましい振る舞いを表現する要素型を記述する。 HTMLには、段落、ハイパーテキストリンク、リスト、表、画像などを表す要素型が含まれる。
どの要素型宣言も、概して、3つの部分を記す。 開始タグ、内容、終了タグ、である。
要素の名前は、開始タグ (<要素名>のように書かれる) 及び 終了タグ (</要素名>のように書かれる)に現れる。終了タグで要素名の前にスラッシュがあることに注意されたい。 例えば、次に示すように UL要素型の開始タグと終了タグは、リストの項目群を囲い込んでいる。
<UL> <LI><P>…リスト項目1… <LI><P>…リスト項目2… </UL>
HTML要素型の中には、著者が終了タグを省略することを許容するものもある。(例えば、P要素型やLI要素型)。 さらに一部の要素型は、開始タグの省略も許容する。例えば、 HEADや BODYがこれである。 HTML DTDは、すべての要素型について、開始タグと終了タグが必須であるかどうかを示している。
HTMLの要素型には、内容が存在しないものもある。 例えばline breakの要素 BRには内容がない。 その唯一の役割は、テキストに含まれる1つの行の終端を示すことである。 このような 空要素は、終了タグを絶対に持たない。 文書型定義にも仕様本文にも、どの要素型が空であるか(内容がないか)や、内容を持てる場合の正当な内容は何かといったことが、示されている。
要素名には、常に大文字小文字の区別はない。
要素を支配する規則については、SGML標準を参照されたい。例えば、要素は適正に入れ子にする必要があるとか、ある1つの終了タグは、マッチする開始タグまで遡る範囲の途中にある、終了タグが省略されている開始タグのすべてを閉じるとか(7.5.1【JIS X4151の6.3.1】)。
例えば、次の第一段落の場合:
<P>これは第一段落である。</P> …ブロック要素…
このマーク付けは、次のように書き直すことができる。
<P>これは第一段落である。 …ブロック要素…
なぜなら、<P>である開始タグは、後ろにブロック要素があることによって閉じられるからである。同様に、ある段落がブロック要素の中に包含されている場合:
<DIV> <P>これは段落である。 </DIV>
包含しているブロック要素の終了タグ(ここでは</DIV>)が、 <P>開始タグが開かれたものを閉じることを暗に示す。
要素はタグではない。 例えば「Pタグ」といった具合に、要素のことをタグという人もいる。しかし、要素は要素であり、タグはタグである(開始タグであれ終了タグであれ)、ということを覚えていただきたい。 例えば、開始HEADタグも終了HEADタグもマーク付け上不在であり得るが、それでもなおHEAD要素は常に存在する。
本仕様が宣言しているすべての要素型は、要素索引に列挙してある。
要素には属性と呼ばれる関連特性があってよい。属性は、デフォルトか、著者やスクリプトによる設定を受け、値を取り得る。 属性/値の組は、要素の開始タグにおいて、開始タグを閉じる「>」の前に出現する。1つの開始タグには、正当な属性/値組が、各組を空白で区切り、いくつ現れてもよい。出現順序は問われない。
デフォルトでは、SGML規定はすべての属性値を二重引用符(ASCII十進34)または単引用符(ASCII十進39)のどちらかを用いて 囲うよう求めている。 二重引用符で属性値が囲われる場合は単引用符がこの属性値の一部を成し得るし、逆の囲い方も可能である。 属性値として引用符を表すことについて、著者は数値文字参照を用いることもできる。二重引用符は"で、単引用符は'である。二重引用符については文字実体参照 "を用いることもできる。
属性の値を引用符で囲わなくてよいケースもある。属性値が、アルファベット(a-z and A-Z)、数字(0-9)、ハイフン(ASCII十進45)、ピリオド(ASCII十進46)、アンダースコア(ASCII十進95)、及びコロン(ASCII十進58)のみを含む場合である。本仕様は、引用符が省略可能な場合であっても省略しないことを推奨する。
属性名には、常に大文字小文字の区別がない。
属性値は、一般的には大文字小文字の区別がない。 リファレンスマニュアルの各属性定義に、値に大文字小文字の区別があるかどうかが示されている。
本仕様が定義するすべての属性は、属性索引に列挙してある。
文字参照とは、HTML文書が含んでよい文字に対する、数値あるいは象徴名称である。 文字参照は、あまり使われない文字を参照したり、オーサリングツールが入力できなかったり入力が難しかったりする文字を参照するのに便利である。 読者は、本書のあちこちで文字参照を目にするであろう。文字参照は、「&」記号で始まり、セミコロン(;)で終わる。よく使う例には、次のものがある。
HTMLの文字参照の詳細については、後にHTML文書文字集合の節で説明する。 本仕様には、HTML 4文書に出現して良い文字参照の一覧も、含まれている。
HTMLコメントのシンタクスを次に示す。
<!-- これはコメントである --> <!-- これもまたコメントであり、 1つの行を超える範囲を占めている -->
マーク付け宣言開始区切り子「<!」とコメント開始区切り子「--」の間に空白文字があってはならないが、コメント終了区切り子「--」とマーク付け宣言終了区切り子「>」の間には空白文字があってもよい。 よくある間違いに、コメント中に連続したハイフン「---」を入れることがある。著者は、コメント中に2つ以上連続するハイフンを含めないようにしなければならない。
コメント中に出現する情報は、特別な意味を持ち得ない。例えば文字参照は文字参照として解釈されることはない。
コメントもマーク付けであるという点に注意されたい。
本仕様本文における要素および属性の定義箇所すべてに、文書型定義の抜粋が記してある。 本書では、要素の特性を記述する手段として、親しみやすくとも長大で不正確な表記を探すことを選ばずに、DTD抜粋を仕様に含めることを選択した。 以下の手引きにより、SGMLに馴染みのない読者でもDTDを読んでHTML仕様の技術的詳細を理解できるようになるであろう。
DTDには、1行あるいは複数行にわたるコメントが出現し得る。DTDのコメントは、前後を「--」で囲われる。例えば:
<!ELEMENT PARAM - O EMPTY -- named property value -->
ここに挙げたコメント「named property value」は、 PARAM要素型の使用法を解説している。DTDのコメントは、参考情報に過ぎない。
HTML DTDは、一連のパラメータ実体定義で開始される。 パラメータ実体定義は、DTDの他の箇所で参照され展開される一種のマクロを定義する。 このマクロは、DTDにのみ出現可能であり、HTML文書には出現し得ない。 文字参照と呼ばれる他の形式のマクロは、HTML文書のテキストや属性値中で利用し得る。
DTDにおいてパラメータ実体が名前で参照されると、それは文字列へと展開される。
パラメータ実体の定義は、「<!ENTITY %」というキーワードで始まり、この後に実体名と、引用符で囲った展開された際の文字列とが続き、最後に「>」で閉じられる。 DTD中のパラメータ実体インスタンスは「%」で始まり、パラメータ実体名が続き、「;」で閉じられる。「;」は省略され得る。
次に、%fontstyle; 実体から展開されるべき文字列を定義した例を示す。
<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
パラメータ実体が展開する文字列には他のパラメータ実体名が含まれていてもよい。このパラメータ実体名は、循環的に展開される。 次に、4つのパラメータ実体「%fontstyle;」「%phrase;」「%special;」「%formctrl;」を含む、%inline;パラメータ実体の定義を例示する。
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
HTML DTDには、%block; と %inline; という、2つのDTD実体が頻出する。 この2つは、内容モデルが各々ブロックレベルとインラインレベルを含むことを示す。 ブロックレベルとインラインレベルについてはHTML文書の大枠構造の項で定義する。
HTML DTDの大部分は、要素型及びその属性の宣言で構成される。 キーワード「<!ELEMENT」で宣言が始まり、「>」記号で終了する。 この間に、次の内容が定義される。
この例は下記のように読める:
<!ELEMENT UL - - (LI)+>
次に、空の要素型を宣言する例を示す:
<!ELEMENT IMG - O EMPTY>
内容モデルは、ある要素のインスタンスが、何を内容としてよいかを記述する。 内容モデル定義には、次の内容が含まれる。
個々の要素の内容モデルは、次のシンタクスで指定される。このリストは完全SGMLシンタクスを単純化したものであって、例えば継承などを示していないことに注意されたい。
HTML DTDにある例を挙げよう:
<!ELEMENT UL - - (LI)+>
<!ELEMENT DL - - (DT|DD)+>
DL要素は1つ以上のDT要素あるいは DD要素を含む必要があるが、その順序は問われない。
<!ELEMENT OPTION - O (#PCDATA)>
OPTION要素は、テキストと、&などの実体のみを含み得る。このことが、 SGMLデータ形式「#PCDATA」で示されている。
HTML要素型の中には、内容モデルから特定要素を除外するものもある。 除外される要素は、ハイフンの後で示される。除外の明示は、内容モデルへの許容を上書きする。
次の例で、-(A) は、A要素が他の A要素には出現できないこと、すなわちアンカーが入れ子にできないことを示す。
<!ELEMENT A - - (%inline;)* -(A)>
A要素型はDTDパラメータ実体 %inline; の一部を成すが、-(A) によって明示的に除外されている、ということに注意されたい。
同様に、次に示す FORM要素の要素型宣言は、フォームが入れ子になることを禁じている。
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>
キーワード「<!ATTLIST」で、ある要素が取り得る 属性の宣言が始まる。 これに、対象となる要素の名称と、属性定義リストが続き、「>」で宣言が終了する。 各属性定義は、三位一体となって次の内容を定義する。
次に、 MAP要素についてname属性が定義される例を示す。MAP要素については、name属性は任意選択である。
<!ATTLIST MAP name CDATA #IMPLIED >
属性値の型に、SGMLデータ型でCDATAであるものが許容されることが示されている。 CDATAとは、文字参照をも含む、テキストのことである。
「CDATA」「NAME」「ID」その他のデータ形式について、詳しくは、HTMLデータの形式の項を参照されたい。
次に、複数の属性定義を示す。
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} から値を取るよう制約されている。
属性定義は、パラメータ実体参照をも含んでよい。
次に例示する、 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;パラメータ実体は、次のように展開される。
上記の属性がほとんどのHTML要素型で定義されるため、簡便化のために%attrs;パラメータ実体が定義されたのである。
同様に、DTD定義は、%URI;パラメータ実体を、CDATA列に展開されるべきものとして定めている。
上の例が示している通り、 パラメータ実体%URI;は、DTDの読者に対して、ある属性のデータ型としてより多くの情報を提供するものである。類似の実体が、「%Color;」「%Charset;」「%Length;」「%Pixels;」などとして定義されている。
属性の中には、論理式を表すブール変数のような役割を果たすものもある。例えば OPTION要素のselected属性がこれである。 ある要素の開始タグにこうした属性が存在する場合、属性の値が「真」であることが示される。存在しない場合、値が「偽」であると示される。
論理型の属性は、正当にはただ1つしか値を取り得ない。この値は属性名それ自体である。例えば selected="selected"など。
次に例示する属性定義は、selected属性を論理型と定めている。
selected (selected) #IMPLIED -- option is pre-selected --
この属性は、要素の開始タグに存在することで「真」に設定される。
<OPTION selected="selected"> …要素の内容… </OPTION>
HTMLでは、論理型属性は 最小化書式で現れてよい。すなわち、属性の 値 が要素の開始タグに単独で現れてよい。 したがって、 selected 属性は次の記述で【「真」に】設定され得る。
<OPTION selected>
上が最小化書式で、下が完全書式である。
<OPTION selected="selected">
著者は、多くのユーザエージェントが論理型属性について完全書式を理解せずに最小化書式のみを理解するという点に、注意を払う必要がある。