世界標準(grobal standard)のhtmlとして位置付けられているISO/IEC 15445:2000 (ISO-HTML)[A]は、国際標準化機構ISOと国際電気標準化会議IECとの合同会議(JTC)によって検討され、2000年5月に公開されたものです。
このhtmlは、W3C勧告のhtml 4.0 strictをベースとし、さらに厳格・厳密に論理構造に徹したsgmlアプリケーションとなっております。さらに最近になり、html4.01 strictのサブセットと位置付けられ、一部文法の訂正が行われました。
書式の大部分はhtml4.01 strictと類似しておりますが、いくつかの点が異なります。それに関して、iso-htmlのDTD(文書型定義)の解析をもとに記述していきたいと思います。
このページでは、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になっており、結果として、後者の採用を意図していることになります。前者の方法では、見えないとは言え余計な要素が入ってしまい、結果として「html4.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 に従った方法を用いた方が良いでしょう。
また、html4.01ではhn要素は通常のブロック要素とみなされ、div要素やblockquote要素に内包させることが可能でしたが、iso-htmlのDTDでは、
<!ENTITY % block "BLOCKQUOTE | DIV | DL | FIELDSET | FORM |
HR | OL | P | PRE | TABLE | UL" >
となっており、見出し要素は「通常のブロック要素」としては見なされておりません。「見出しの階層構造が「あらわ」でない記述」の項で述べた通り、見出し要素は、常にbody要素の直下に記述しなければなりません。
html4.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要素だけです。
フォームの記述は、html4.01 strict同様、
となっております。
かつてのDTDでは、フォーム構成要素は特別なグループ(%form.content)と見倣され、form要素直下にしか置くことが出来ませんでした。最近になり、html4.01との整合性が検討され、訂正されたものと思われます。事実、form要素の宣言は
<!--<!ELEMENT FORM - - %form.content; -(FORM) >--> <!ELEMENT FORM - - (%block;)+ -(FORM) >
となっており、かつての宣言がコメントアウトされていることが分かります。また、form要素に通常のブロック要素が入ることから、テーブルによる整形も文法違反ではありません。
html4.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要素はhtml4.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>
という記述は、html4.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各要素は、html4.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属性が必須であることは、html4.01と同様です。
html4.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ブラウザとの互換性のためにhtml4.01中で採用されている物理的属性width, border, cellspacing, cellpadding, frame, rules各属性は、iso-htmlでは全て排除されております。
html4.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)" >
となっており、html4.01には存在していたimage, button各値を取ることは出来ません。
DTD をもとに深く突っ込んだ話はしませんが、以上の他に、以下の属性記述が html 4.01 とは異なります。
html4.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は、html4.01でも定義されております。
その他、詳細な説明は割愛しますが、共通属性として、%coreと%i18nが定義されております。これらはそれぞれ、html4.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" >
html4.01のdtdから察するに、これらは上から順にラテン文字(iso-8859-1), 数式文字とギリシア文字, マークアップ文字と国際化文字(双方向文書に関係するものも含む)の実体を現しているようです。お馴染みの<, &などは、%HTMLspecialに含まれております。
とは言え、公開識別子がhtml4.01のDTDと少々食い違っており、実際にどのような実体参照を示しているのかは、正確には分かりません。ただしコメントの中にSpecify character entity sets defined by W3C
と書かれているので、恐らくは html4.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はhtml4.0 strictのサブセットとして位置付けられていることもあり、使える文字やタグの省略可否などを表しているSGML宣言は、html4.0(1)のそれと比べ、コメントを除いて全く同一です。
つまり、iso-htmlはhtml4.0(1)と同様、
などとなっております。ただ一つ、区切り子文字としては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 と異なり、「論理構造」に徹し、妥協がないhtmlであるため、私は好んで用いております。ただ私の場合は、xhtml-basicを元に、iso-htmlの文法に乗っ取った XHTML Primary という形で採用しております。それ故、私の書いた文書の多くは、明示的にはxhtml-basic準拠ですが、暗示的にはiso-html準拠であると言えます。
ただし、各種要素の法則に「くせ」があるのもまた事実です(addressなど)。
さらに言えば、これが「公式標準」となっているにも関わらず、各種企業がこのhtmlを採用していない(自社サイトのみならず、オーサリングツールなどでも)ことも、広まっていない原因の一つではないかと思います。
JIS-htmlですが、特別にDTDなどが用意されているわけではありません。文書型宣言はiso-htmlと同一のものを使用します。