◆ はじめに
さて、本講座のタイトル「ストリクト」の元になった「StrictDTD」を説明するときが来ました。
はじめに「はじめにテキストありき」、そして、それを各要素に分別し、マークアップをしますが、実は、そこには、厳格な規則が存在するのです。
ここで云う、厳格な規則とは、StrictDTD(厳格な文書型定義)です。
◆ 文書型定義
HTMLは、ご存知のようにひとつのSGMLアプリケーションです。
SGMLは、文書型定義と文書インスタンス(普通、単に文書と呼ぶ)から成ります。
私達がHTMLで作っているものは、文書(文書インスタンス)です。
しかし、当然、HTMLもひとつのSGMLですから、文書型定義があるはずですよね。
そう、文書型定義は、あらかじめW3Cですでに定められているのです。
では、文書型定義が定める用件とは...。
- どんな構成要素があるのか
- 要素の出力順序、出現回数
- 要素の親子関係
などです。
また、文書型定義には、要素宣言、パラメータ実体定義、属性宣言などから成ります。
◆ 要素宣言
要素宣言の記述方法は以下のようになります。
<!ELEMENT 要素型名 - - (内容モデル) -- コメント -->
たとえば、a要素の場合は、
<!ELEMENT A - - (%inline;)* -(A) -- anchor -->
となります。では、各々説明いたします。
- <!ELEMENT
- 要素宣言であることを表します。
- A
- 宣言されている要素型はAであることを表します。
- - -
- この要素型の開始タグ <a> と終了タグ </a> の両方が必須であることを示す。
ちなみに、- でなく 0 時は省略が可能を示します。 - (%inline;)* -(A)
- この要素型の内容モデルは、他のインライン要素(%inline;)を記述できますが、A要素の入れ子は例外として(子孫にわたって)禁止されます。
- -- anchor --
- DTDコメントです。
- 内容モデル
- 別の場所で定義された要素型名や実体名を使って、どんな内容がどんな順序で何回出現できるかを定義します。これによって要素の親子関係が決まります。出現順序や回数は次のような記号(演算子)で示します。
以下がDTDの内容モデルの表記方法です。- ( と )
- グループの範囲を示す。
- A
- Aが1回のみ出現しなければならない。
- A+
- Aは1回以上出現しなければならない。
- A?
- Aは0回または1回のみ出現しなければならない。
- A*
- Aは0以上の回数出現してよい。
- +(A)
- Aが出現してよい。
- -(A)
- Aは出現してはならない。
- A | B
- AとBのどちらかが出現しなければならない。双方同時に出現してはいけない。
- A , B
- AとBがこの順序で出現しなければならない。
- A & B
- AとBが必要だが、順序は問わない。
- EMPTY
- 内容を持ってはならない。
- #PCDATA
- 文字列。
ただし、文字参照は展開されて対応する文字に置き換えられる。たとえば &amp; と書くと & に置き換えられます。また、マークアップ記号はマークアップ記号として解釈される。たとえば < はタグの開始区切り子と見なされます。
補足例
ul要素の場合
<!ELEMENT UL - - (LI)+>
宣言されている要素型はULです。
2つのハイフンは、この要素型の開始タグ <UL> と終了タグ </UL> の両方が必須であることを示します。
この要素型の内容モデルは、「少なくとも1つのLI要素」であると宣言されています。
img要素の場合
<!ELEMENT IMG - O EMPTY>
宣言されている要素型はIMGです。
ハイフンとその後ろのOは、終了タグが省略可能であることを示していますが、内容モデルが「EMPTY」なので、ここでは終了タグが省略されねばならないことを意味します。
この要素型の内容モデルは、キーワード「EMPTY」で、この要素型のインスタンスが内容を持ってはいけないことを意味します。
dl要素の場合
<!ELEMENT DL - - (DT|DD)+>
宣言されている要素型はDLです。
2つのハイフンは、この要素型の開始タグ <DL> と終了タグ </DL> の両方が必須であることを示します。
この要素型の内容モデルは、1つ以上のDT要素あるいは DD要素を含む必要がありますが、その順序は問われません。
option要素の場合
<!ELEMENT OPTION - O (#PCDATA)>
宣言されている要素型はOPTIONです。
ハイフンとその後ろのOは、終了タグが省略可能であることを示しています。
この要素型の内容モデルは、#PCDATAで、これは、テキストと&などの実体のみを含み得る。
form要素の場合
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>
宣言されている要素型はFORMです。
2つのハイフンは、この要素型の開始タグ <FORM> と終了タグ </FORM> の両方が必須であることを示します。
この要素型の内容モデルは、ブロックレベル、または、スクリプトが一回以上出現しなければなりません。
そして、フォームが入れ子になることを禁じています。
◆ パラメータ実体定義
すでに、前記でインライン要素を%inline;で表しましたが、これを実体名と云います。そして、この実体名を定義することがパラメータ実体定義です。
パラメータ実体定義の記述方法は以下のようになります。
<!ENTITY 実体名 "置換実体文" >
たとえば、%headingの場合は、
<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
となります。実体名の前に%を加え、参照時に%実体名;という形態をとります。
たとえば、DTDのどこかで上記を定義しておき、別のところで以下のようにまとめて要素宣言ができるようになります。
<!ELEMENT (%heading;) - - (%inline;)*>
以下にStrictDTDの主なパラメータ実体定義を示します。
<!ENTITY % Datetime "CDATA" -- date and time information. ISO date format -->
<!ENTITY % Script "CDATA" -- script expression -->
<!ENTITY % StyleSheet "CDATA" -- style sheet data -->
<!ENTITY % Text "CDATA">
<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->
<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
<!ENTITY % list "UL | OL">
<!ENTITY % preformatted "PRE">
<!ENTITY % coreattrs
"id ID #IMPLIED -- document-wide unique id --
class CDATA #IMPLIED -- space-separated list of classes --
style %StyleSheet; #IMPLIED -- associated style info --
title %Text; #IMPLIED -- advisory title --"
>
<!ENTITY % i18n
"lang %LanguageCode; #IMPLIED -- language code --
dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --"
>
<!ENTITY % fontstyle
"TT | I | B | BIG | SMALL">
<!ENTITY % phrase "EM | STRONG | DFN | CODE |
SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
<!ENTITY % special
"A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
<!ENTITY % block
"P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
<!ENTITY % flow "%block; | %inline;">
◆ 属性宣言
属性宣言の記述方法は以下のようになります。
<!ATTLIST 要素タイプ名 属性名 属性値 省略時値orキーワード >
一つの要素タイプに対して属性は40まで定義できるので、「属性名 属性値 省略時値」のセットを連続して記述して複数の属性を定義します。
属性値として、CDATAは文字データを、NAMEは特別な約束に従った名前を、省略時値として使われる#IMPLIEDは値はシステムが用意するので記述しなくても問題ない、#REQUIREDは省略せずに必ず記述という意味になります。
たとえば、meta要素の属性宣言場合は、
<!ATTLIST META %i18n; -- lang, dir, for use with content -- http-equiv NAME #IMPLIED -- HTTP response header name -- name NAME #IMPLIED -- metainformation name -- content CDATA #REQUIRED -- associated information -- scheme CDATA #IMPLIED -- select form of content -- >
となっていて、属性としては%i18n;というパラメータ実体で宣言されたものと、http-equiv, name, content, scheme の4つを指定することがでます。 そのうちcontentは必須で、それ以外は指定しなければシステムが既定値を用意します。 指定する値は、http-equiv, nameはIDと同じ名前文字、content, schemeは一般の文字(数字を含む)データです。
(補足)属性値NAMEについて
属性値NAMEは、id属性や、name属性の値の付け方と同じで、一定の約束があります。これらは、アルファベット[A-Za-z]で始まり、そのあとにアルファベット、数字[0-9] 、ハイフン( - )、アンダースコア( _ )、コロン( : )、ピリオド( . )を組み合わせた名前でなければなりません。
注意としては、一文字目がアルファベット[A-Za-z]で始まることです。(name属性はその限りではありませんが...。でも...。)また、コロンは、XMLの名前空間の接頭辞を区切る文字と混乱しかねないので、避けた方がよいかも知れません。あと、アンダースコア( _ )、コロン( : )、ピリオド( . )はCSSスタイルシートのセレクタとしては使うことができないので注意してください。さらに、日本語による名前を直接指定することは事実上できないので注意してください。(ブラウザによっては大丈夫な場合がありますが、やめときましょう...。)
◆ おわりに
今回、DTD(文書型定義)についてお勉強をしましたが、ご理解できたでしょうか...。
普段何気なくマークアップをしていますが、結構、いろいろあるんですね。私もはじめて気づきました。
リファレンスの方にも、要素宣言を新たに追加しました。
そして、要素宣言を見れば、より「正しいHTML」が実践できるコトと思います。頑張りましょう!
尚、本ページ作成にあたって、以下のページを参考にさせて頂きました。大変ありがとうございました。
本ページより、数段素晴らしいページですので、是非アクセスしてみてください。