This standard was last reviewed and confirmed in 2023. Therefore this version remains current.よって、「HTML Living Standardが唯一の国際規格である」という表現は誤りです。
このページでは、DTDの読み方に関する解説や、各種要素や属性に関する解説をしません。詳細は各種優秀サイト[B]を御覧いただければ、と思います。しかし、各種法則の裏付けとして DTD を用いているだけなので、 DTD の部分を読み飛ばしても結論は読み取れるのではないかと思われます。
このバージョンの HTML で使用できる要素は以下の通りです。尚、分類はこちらで勝手に付けさせていただきました。
div?要素は、見出し要素h?の階層構造を判定するために、 Pre-HTML でのみ用いられます。
big, smallが削除されてb, iが残されたのは、文字の大きさを調整出来ないテキストベースのWebブラウザでの表示や、科学計算や数式のことを考慮したためと思われます。
具体的な相違は、順を追って説明します。
DTD には、以下のような、二通りの記述があります。一つは、見出しの階層を DTD によって記述しているもの、もう一つは、見出しの階層構造を「あらわに」見せていない記述です。
まず一つ目の記述では、新しい(見えない、あるいは開始終了タグ省略可の)要素を導入することにより、見出しの階層構造を「あらわに」見せています。
<!-- The following marked section is informative only --> <![ %Preparation; [ <!ELEMENT Pre-HTML - - (HEAD, BODY) > <!ATTLIST Pre-HTML %i18n; -- Internationalization DIR and LANG --> <!ELEMENT BODY - O ((%block;)*,(H1,DIV1)* ) +(DEL|INS) > <!ELEMENT H1 - - (%text;)+ > <!ELEMENT DIV1 O O ((%block;)*, (H2,DIV2)* ) > <!ELEMENT H2 - - (%text;)+ > <!ELEMENT DIV2 O O ((%block;)*, (H3,DIV3)* ) > <!ELEMENT H3 - - (%text;)+ > <!ELEMENT DIV3 O O ((%block;)*, (H4,DIV4)* ) > <!ELEMENT H4 - - (%text;)+ > <!ELEMENT DIV4 O O ((%block;)*, (H5,DIV5)* ) > <!ELEMENT H5 - - (%text;)+ > <!ELEMENT DIV5 O O ((%block;)*, (H6,DIV6)* ) > <!ELEMENT H6 - - (%text;)+ > <!ELEMENT DIV6 O O ((%block;)*) > ]]>
つまり、 hn 要素が現れると、自動的に divn 要素があると見なされるわけです(divn タグは開始終了共に省略可能ですので、 Web サイト制作者は意識する必要はありません)。
上記の DTD の記述によれば、見出しの構造は、以下のように見なされます。
ただし、 (Hn,DIVn)*
という表記からも分かる通り、見出しが一つもない HTML 文書でも妥当と見倣されてしまいます。せめて、 h1, div1 要素 の記述は必須にして欲しかったものです。
もう一つ、見出しの部分には、以下の記述があります。
<!-- The following marked section is normative --> <![ %NoPreparation; [ <!ELEMENT BODY - O (%block;|H1|H2|H3|H4|H5|H6)+ +(DEL|INS) > <!ELEMENT (H1|H2|H3|H4|H5|H6) - - (%text;)+ > ]]>
こちらは、見出しの構造が DTD によっては明記されておりません。つまり、 h1 の後でいきなり h3 が来たり、 h2 から始まることがあっても、 DTD 的には許されると思われます。
それを論じる前に、まずは、実体参照の%Preparation;
及び%NoPreparation;
の関係を見たいと思います。 DTD の最初に、以下のような記述があります。
<!ENTITY % Preparation "IGNORE" > <!ENTITY % NoPreparation "INCLUDE" -- Inverse of Preparation = IGNORE --> <![ %Preparation; [ <!ENTITY % NoPreparation "IGNORE" -- Inverse of Preparation = INCLUDE --> ]]>
つまり、%Preparation
はIGNORE
に、%NoPreparation
がINCLUDE
になっており、結果として、後者の採用を意図していることになります。前者の方法では、見えないとは言え余計な要素が入ってしまい、結果として「HTML 4.01 のサブセット」とは見なされなくなってしまうためです。
ただし、上記の記述では、予め内部サブセットで <!ENTITY % Preparation "INCLUDE" >
としてもうまくいきません。実体宣言は「前の記述が優先」されるため、上記の記述では、 %NoPreparation;
は INCLUDE
のままになってしまいます。
本来の働きをさせるためには、以下のような記述をしなければなりません。
<!ENTITY % Preparation "IGNORE" > <![ %Preparation; [ <!ENTITY % NoPreparation "IGNORE" -- Inverse of Preparation = INCLUDE --> ]]> <!ENTITY % NoPreparation "INCLUDE" -- Inverse of Preparation = IGNORE -->
DTD だけから判断するに、見出しの順序はでたらめでも「正当な HTML 文書」と見なされます。しかし、DTD内のコメントに、
<!ATTLIST (H1 | H2 | H3 | H4 | H5 | H6) --The H1 element shall not be followed by an H3, H4, H5 or H6 element without an intervening H2 element. (以下略)
と書かれている通り、見出しを階層通りに記述することが求められております。
前者の記述を有効にするためには、
Pre-HTML
へ変更%Preparation
を INCLUDE に上書きとする必要があります。詳細は「DTD の書き換えについて」を御覧ください。
Another HTML Lint で示されている方法は、仕様の観点から言えば正しくありません。下手をすると SGML パーザを混乱させる元となるかも知れないので、極力 User's Guide に従った方法を用いた方が良いでしょう。
また、 HTML 4.01 では hn 要素は通常のブロック要素とみなされ、 div 要素や blockquote 要素に内包させることが可能でしたが、 ISO-HTML の DTD では、
<!ENTITY % block "BLOCKQUOTE | DIV | DL | FIELDSET | FORM | HR | OL | P | PRE | TABLE | UL" >
となっており、見出し要素は「通常のブロック要素」としては見なされておりません。「見出しの階層構造が「あらわ」でない記述」の項で述べた通り、見出し要素は、常に body 要素の直下に記述しなければなりません。
HTML 4.01 では、 html, head, body, tbody は開始・終了共に省略可となっておりますが、 ISO-HTML の DTD では、
<!ELEMENT HTML - - (HEAD, BODY) > <!ELEMENT HEAD - O (TITLE) +(LINK | META | STYLE) > <!ELEMENT BODY - O ((%block;)*,(H1,DIV1)* ) +(DEL|INS) > <!ELEMENT (THEAD,TFOOT,TBODY) - O (TR)+ >
となっており、開始タグは省略不可となっております。html要素に至っては、終了タグの省略も出来ません。
なお、上の記述によれば、 tfoot や thead の開始タグも省略出来ないことになっていますが、
<!ELEMENT TABLE - - (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+) >
となっているため(?は0個か1個, +は1つ以上必要を、それぞれ意味する)、テーブル記述においてどうしても省略出来ないのは tbody 要素だけです。
フォームの記述は、 HTML 4.01 Strict 同様、
となっております。
かつての DTD では、フォーム構成要素は特別なグループ(%form.content)と見倣され、 form 要素直下にしか置くことが出来ませんでした。最近になり、 HTML 4.01 との整合性が検討され、訂正されたものと思われます。事実、 form 要素の宣言は
<!--<!ELEMENT FORM - - %form.content; -(FORM) >--> <!ELEMENT FORM - - (%block;)+ -(FORM) >
となっており、かつての宣言がコメントアウトされていることが分かります。また、 form 要素に通常のブロック要素が入ることから、テーブルによる整形も文法違反ではありません。
HTML 4.01 では、筆者の聯絡先を記述する address 要素は通常のブロック要素として扱われるため、設置に関しては特に気を使う必要はありませんでした。しかし ISO-HTML では address 要素は特別な要素として定義されており、設置にはいくつかの注意点が必要です。具体的には、
ことです。例によって DTD を参照しますと、
<!ENTITY % section.content "(%block; | %text; | ADDRESS)+" > <!ELEMENT BODY - O ((%block;)*,(H1,DIV1)* ) +(DEL|INS) > <!ELEMENT DIV - - %section.content; > <!ELEMENT FIELDSET - - (#PCDATA,LEGEND,(%block; | %text; | ADDRESS)+) -(FIELDSET) > <!ELEMENT OBJECT - - (PARAM | %section.content;)* >
となっており、 body 要素直下に address 要素を置くことは出来ません。どうしても任意の位置に設置したい場合は、 div 要素に内包させる必要があります。
かつては form 要素直下に置くことが許されていましたが、 form 要素の宣言変更により禁止されました(form.content の定義が無くなったため)。
さらに、中身については、
<!ELEMENT ADDRESS - - (%text;)+ -(IMG|OBJECT|MAP) >
となっており、事実上、テキスト関係しか入れることが出来ません。
註:以下の記述は個人的な見解です。 ISO の公式見解ではないので、ご注意ください。
ISO-HTML の user's guide (13.2) では、「address 要素は body, blockquote, div, fieldset, form, and object各要素に記述できる」という記述がされております。
これを見る限り、 address 要素は HTML 4.01 などと同等、普通のブロック要素と見倣すのが合理的であると思います。しかし、その直後で、
The <ADDRESS> element should not to be used to markup up, for example, a list of addresses of the members of a club.
とある通り、通常のブロック要素とは少し違う性質を有する(べき)ものであると解釈出来ます。例えば、
<ul> <li><address>name1 (ff1@ahahen.com)</address></li> <li><address>name2 (ff2@ahahen.com)</address></li> </ul>
という記述は、 HTML 4.01 では認められるものの、 ISO-HTML では、DTD 上でも仕様上でも認められておりません。現に、リスト関聯の中身は、
<!ELEMENT LI - O (%text; | %block;)+ > <!ELEMENT DD - O %section.content; -(ADDRESS) >
であり、わざわざ address 要素を除いております。
以上より、 address 要素を他のブロック要素とは違うものとしたいという意図は察しがつくのですが、未だに body や blockquote などに置けない理由は分かりません。もしかすると、単に忘れただけ、ということも考えられなくはないのですが、どのようなものでしょうか。
私の場合は、文末に address 要素を置いているので、ナビゲーションバーも含めて<div class="footer">
の中に入れております。
編集用の要素である del, ins 各要素に関する記述は、以下の通りです。
<!ELEMENT BODY - O ((%block;)*,(H1,DIV1)* ) +(DEL|INS) > <!ELEMENT (DEL|INS) - - (%text;)+ > <!ATTLIST INS %core; -- Element CLASS, ID and TITLE -- %i18n; -- Internationalization DIR and LANG -- CITE %URI; #IMPLIED -- Information on reason for change -- DATETIME CDATA #IMPLIED -- When changed, subset of ISO/IEC 8601 -->
ISO date format)のみですが、 ISO-HTML の DTD では、「ISO/IEC 8601 のサブセット」と、しっかり明記されております。
img/object 各要素は、 HTML 4.01 では width 属性と height 属性が入れられます。しかし ISO-HTML では、例えば img 要素の記述では、
<!ATTLIST IMG %core; -- Element CLASS, ID and TITLE -- %i18n; -- Internationalization DIR and LANG -- ALT CDATA #REQUIRED -- Text for text-only user agent -- ISMAP (ismap) #IMPLIED -- Use server image map -- LONGDESC %URI; #IMPLIED -- Extended description for text UA -- SRC %URI; #REQUIRED -- URI of image to embed -- USEMAP %URI; #IMPLIED -- Use client-side image map -->
となっているため、これらの属性を包含させることは出来ません。また、 img 要素に alt 属性が必須であることは、 HTML 4.01 と同様です。
HTML 4.01 では、 summary 属性は任意となっておりました。しかし、
<!ATTLIST TABLE %core; -- Element CLASS, ID and TITLE -- %i18n; -- Internationalization DIR and LANG -- SUMMARY CDATA #REQUIRED -- Purpose/structure for speech output -->
の通り、 ISO-HTML では必須要素となっております。
尚、旧来の Web ブラウザとの互換性のために HTML 4.01 中で採用されている物理的属性 width, border, cellspacing, cellpadding, frame, rules 各属性は、 ISO-HTML では全て排除されております。
HTML 4.01 中で許されていた物理的属性は、 ISO-HTML では悉く排除されております。例えば、セルを格納する td 要素に関する記述は、
<!ATTLIST TD %core; -- Element CLASS, ID and TITLE -- %i18n; -- Internationalization DIR and LANG -- ABBR CDATA #IMPLIED -- Abbreviation for header cell -- AXIS CDATA #IMPLIED -- Names groups of related headers -- COLSPAN NUMBER 1 -- Number of columns spanned by cell -- HEADERS IDREFS #IMPLIED -- List of ID's for header cells -- ROWSPAN NUMBER 1 -- Number of rows spanned by cell -- SCOPE (col|colgroup|row|rowgroup) #IMPLIED -- Scope covered by header cells -->
となっており、 align, valign 各属性などは除外されております。
input 要素の type 属性で取り得る値は、実体参照%InputType
で決められております。実際の記述では、
<!ENTITY % InputType "(checkbox | file | hidden | password | radio | reset | submit | text)" >
となっており、 HTML 4.01 には存在していた image, button 各値を取ることは出来ません。
DTD をもとに深く突っ込んだ話はしませんが、以上の他に、以下の属性記述が HTML 4.01 とは異なります。
HTML 4.01 では、同じ CDATA を取り得る属性値においても、%ContentType
, %Charset
, %LanguageCode
, %LinkTypes
など、数多くの実体参照が定義されております。これは値の性格をDTD上においても分かりやすく解説しようとする意図があってのことと思われます。
しかし ISO-HTML ではその数はかなり押えられており、
<!ENTITY % Content-Type "CDATA" -- MIME content type, RFC1521 --> <!ENTITY % HTTP-Method "(get | post)" -- as per HTTP/1.1 RFC2068 --> <!ENTITY % URI "CDATA" -- Universal Resource Identifier, RFC1630 -->
<!ENTITY % shape "(circle | default | poly | rect)" > <!ENTITY % InputType "(checkbox | file | hidden | password | radio | reset | submit | text)" >
と、 form 要素の enctype 属性(省略時はapplication/x-www-form-urlencoded
に設定)と method 属性、そしてリソースのありかを示す URI 、そして a, area 要素の shape 属性及び input 要素の type 属性のみが定義されております。とくに前者の%Content-Type
は、 meta 要素では用いられていないことに注意してください。
尚、後者の%shape
及び%InputType
は、 HTML 4.01 でも定義されております。
その他、詳細な説明は割愛しますが、共通属性として、%core
と%i18n
が定義されております。これらはそれぞれ、 HTML 4.01 における%coreattrs
と%i18n
に相当します。
文字に関する実体参照は、以下の記述になっております。
<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Full Latin 1//EN//HTML" > <!ENTITY % HTMLsymbol PUBLIC "-//W3C//ENTITIES Symbolic//EN//HTML" > <!ENTITY % HTMLspecial PUBLIC "-//W3C//ENTITIES Special//EN//HTML" >
HTML 4.01 の DTD から察するに、これらは上から順にラテン文字 (ISO-8859-1), 数式文字とギリシア文字, マークアップ文字と国際化文字(双方向文書に関係するものも含む)の実体を現しているようです。お馴染みの<, &などは、%HTMLspecial
に含まれております。
とは言え、公開識別子が HTML 4.01 の DTD と少々食い違っており、実際にどのような実体参照を示しているのかは、正確には分かりません。ただしコメントの中にSpecify character entity sets defined by W3C
と書かれているので、恐らくは HTML 4.01 と同じ実体参照が使えるものと思われます。
ISO-HTMLでは、タブ文字(tab)に関して、特殊な宣言をしております。
<!ENTITY nontab " " >
一般実体&nontab;に関する定義で、&nontab;を半角の空白文字に展開するための宣言です。
<!SHORTREF tabmap " " nontab >
短縮参照対応表宣言を用いて、 tabmap という名前の対応表に対し、実際のタブ文字を一般実体&nontab;と見倣すようにしております。
<!USEMAP tabmap HTML >
tabmap という対応表を、 HTML 要素内で適用させるための宣言です。
仕様書(9.1 Document type declaration)によれば、内部サブセットを用いて DTD の内容を変更することはできないことになっています。しかし、 DTD の公開識別子を -//ISO-HTML User's Guide//DTD Preparation of ISO-HTML//EN
とすることで、そのような書き換えをすることが出来ます。例えば、実体参照を新たに定義することで記述の繰り返しを簡略化したり、Pre-HTML
/divn
を定義して「見出しの位置関係」を検証したりすることが出来ます。
例えば、見出しの位置関係の検証のためにPre-HTML
/divn
を使えるようにし、文字列 abcdefg
を &a;
として定義するためには、以下のような記述をします。
<!DOCTYPE Pre-HTML PUBLIC "-//ISO-HTML User's Guide//DTD Preparation of ISO-HTML//EN" [ <!ENTITY % Preparation "INCLUDE" > <!ENTITY a "abcdefg"> ]> <Pre-HTML lang="ja"> <head> .......(本文) </Pre-HTML>
ただし、この記述は ISO-HTML の公式のものには違反するため、実際に Web に公開するためには、文書型宣言やルート要素を元に戻し、 ISO-HTML 本来の DTD に従った記述に戻す必要があります。
ISO-HTML は HTML 4.01 Strictのサブセットとして位置付けられていることもあり、使える文字やタグの省略可否などを表しているSGML宣言は、 HTML 4.01 のそれと比べ、コメントを除いて全く同一です。
つまり、 ISO-HTML は HTML 4.01 と同様、
などとなっております。ただ一つ、区切り子文字としては tab が入っておりますが、 ISO-HTML では
FUNCTION RE 13 RS 10 SPACE 32 TAB SEPCHAR 9 -- Deprecated --
と記述しており、tabによる区切りを「非推奨」のものとみなしています。
ISO-HTML の DTD を他の SGML 応用系で利用したい場合は、次のような「設計支援宣言 (architectural support declaration)」(註;作者の造語)を使うそうです。これに関しては、 DTD 内のコメントの中に記述されておりますが、 SGML 処理命令を使う方法と記法宣言を用いる方法との二通りあります(似たような記述が、XHTML Base Architecture Moduleにもあります)。
SGML 処理命令を使う場合は、以下のような記述を行います。
<?IS10744 arch name="html" public-id="ISO/IEC 15445:2000//DTD HyperText Markup Language//EN" dtd-system-id="ftp://ftp.cs.tcd.ie/isohtml/15445.dtd" renamer-att="HTMLnames" doc-elem-form="HTML" >
記法宣言(<!NOTATION ...)を用いる場合は、以下の様に記述します。具体的なパラメータ設定には、属性宣言を用いているようです。
<!ENTITY % HtmlDtd PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN"> <?IS10744 ArcBase HTML> <!NOTATION HTML PUBLIC "-//ISO-HTML User's Guide//NOTATION HTML Architecture//EN"> <!ATTLIST #NOTATION HTML ArcDTD CDATA #FIXED "%HtmlDtd" ArcDocF NAME #FIXED "HTML" ArcNamrA NAME #IMPLIED >
ISO-HTMLのuser's guideにも、上記の宣言を具体的にいつ、どのように用いるべきかは記載されておりません。恐らくは、 ISO-HTML 準拠の HTML 文書を他の SGML 応用系で用いたい場合を考慮して、文書型宣言中に内部サブセットとして置くものと思われます。処理命令の記述だけであれば、文書型宣言の前に置く手もあるでしょう。
設計支援宣言の記述方法に関する詳細は、以下のサイトが役に立つと思われます。
国際標準として規格化された HTML ですが、 ISO-HTML 準拠のサイトは少ないようです。
W3C により策定された HTML 4.01 / XHTML 1.x と異なり、「論理構造」に徹し、妥協がない規格であるため、私は好んで用いております。
ただし、各種要素の法則に「くせ」があるのもまた事実です( address など)。
さらに言えば、これが「公式標準」となっているにも関わらず、各種企業がこの HTML 規格を採用していない(自社サイトのみならず、オーサリングツールなどでも)ことも、広まっていない原因の一つではないかと思われます。
JIS-htmlですが、特別にDTDなどが用意されているわけではありません。文書型宣言は ISO-HTMLと同一のものを使用します。