ISO/IEC 15445:2000 (ISO-HTML)の書式について

目次

はじめに

注意点

このページでは、DTDの読み方に関する解説や、各種要素や属性に関する解説をしません。詳細は各種優秀サイト[B]を御覧いただければ、と思います。しかし、各種法則の裏付けとして DTD を用いているだけなので、 DTD の部分を読み飛ばしても結論は読み取れるのではないかと思われます。

ISO-HTML の要素群

このバージョンの HTML で使用できる要素は以下の通りです。尚、分類はこちらで勝手に付けさせていただきました。

構造要素
html, head, body
見出し要素
h1, h2, h3, h4, h5, h6
ヘッダ要素
title, link, meta, style
特別インライン要素(special; %special;)
a, bdo, br, img, object, map, q, span
論理インライン要素(Logical character styles; %logical.styles;)
abbr, acronym, cite, code, dfn, em, kbd, samp, strong, var
物理インライン要素(Physical character styles; %physical.styles;)
b, i, sub, sup, tt
フォーム構成インライン要素(Form fields; %form.fields;)
button, input, label, select, textarea
一般ブロック要素(Block-like elements; %block;)
blockquote, div, dl, fieldset, form, hr, ol, p, pre, table, ul
リスト要素
li, dt, dd
特殊ブロック要素
del, ins
フォーム構成副要素
optgroup(select内でのみ使用可)
テーブル要素
caption, col, colgroup, thead, tfoot, tbody, tr, th, td
アドレス要素
address
疑似要素(Pre-HTMLでのみ有効)
div1, div2, div3, div4, div5, div6
その他
legend(fieldset内で使用可), param(object内で使用可)

div?要素は、見出し要素h?の階層構造を判定するために、 Pre-HTML でのみ用いられます。

HTML 4.01 との相違点

要素・属性の有無

big, smallが削除されてb, iが残されたのは、文字の大きさを調整出来ないテキストベースのWebブラウザでの表示や、科学計算や数式のことを考慮したためと思われます。

文法上の違い

具体的な相違は、順を追って説明します。

見出しの階層

DTD には、以下のような、二通りの記述があります。一つは、見出しの階層を 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 -->
]]>

つまり、%PreparationIGNOREに、%NoPreparationINCLUDEになっており、結果として、後者の採用を意図していることになります。前者の方法では、見えないとは言え余計な要素が入ってしまい、結果として「HTML 4.01 のサブセット」とは見なされなくなってしまうためです。

附記; DTD 上の記述ミス

ただし、上記の記述では、予め内部サブセットで <!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.  
(以下略)

と書かれている通り、見出しを階層通りに記述することが求められております。

前者(DTD に階層を明記した記述)の利用法

前者の記述を有効にするためには、

とする必要があります。詳細は「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 要素に通常のブロック要素が入ることから、テーブルによる整形も文法違反ではありません。

address 要素記述の注意点

DTD の記述より

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) >

となっており、事実上、テキスト関係しか入れることが出来ません。

address 要素の特殊性

註:以下の記述は個人的な見解です。 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 要素

編集用の要素である 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 -->

属性について

img/object 各要素

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 と同様です。

table 要素

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 では全て排除されております。

table 関聯要素

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 要素

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), 数式文字とギリシア文字, マークアップ文字と国際化文字(双方向文書に関係するものも含む)の実体を現しているようです。お馴染みの&lt;, &amp;などは、%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 要素内で適用させるための宣言です。

DTD の書き換えについて

仕様書(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 に従った記述に戻す必要があります。

SGML 宣言

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による区切りを「非推奨」のものとみなしています。

他の SGML 応用系への利用

設計支援宣言

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 規格を採用していない(自社サイトのみならず、オーサリングツールなどでも)ことも、広まっていない原因の一つではないかと思われます。

ISO-HTML 関聯サイト

ISO/IEC 15445:2000(E) ISO-HTML[U]
ISO の規格書。 2022 年現在、現行の規格です。
User's Guide to ISO/IEC 15445:2000(E) ISO-HTML[V]
ISO-HTMLの説明書です。英語版。
日本工業規格 JIS X 4156:2000 ハイパテキストマーク付け言語[W]
ISO-HTMLの邦訳。名前はJIS-htmlですが、特別にDTDなどが用意されているわけではありません。文書型宣言は ISO-HTMLと同一のものを使用します。

参考サイト

ごく簡単なHTMLの説明[X]
神崎正英様のサイト。 DTD の読み方に関する分かりやすい説明、 ISO-HTML 含む各種 HTML/XML 文書に関する詳細な説明があります。現在は ISO-HTML を専門に扱った文書は削除されてしまいましたが、非常に参考になりますので、一読をお勧めいたします。
HTML鳩丸倶楽部[Y]
水無月ばけら様のサイト。 SGML 宣言の読み方は、このサイトが大いに参考になりました。
PC Tips[Z]
野嵜健秀様のサイト。 HTML の理念は大いに学ばせて頂きました。その他、紹介文や、リンク集などもあります。
基礎理論/SGML文書の構成(リンク切れ)
SGMLのマークアップ宣言に関する情報が、分かりやすく説明されております。普段見慣れない短縮参照に関する宣言(!SHORTREF, !USEMAP)などは、こちらのサイトが参考になりました。