[1] [[HTML 4]] と [[XHTML 1.0]] の違いは、 XHTML 1.0 勧告に書いてありますが、 そこに載っていない細かな違いもあったりします。 XHTML 1.0 [ABBR[FE][First Edition]] と [ABBR[SE][Second Edition]] でも違いがいくつかありまして、そのうちの多くは HTML 4 により近づけるためのものです。 XHTML 1.0 仕様書は旧来の[[具象構文]]から [[XML]] への移行に伴う大きな変更点をつらつらと述べていますが、 細かな変更点は (意図しているのか間違いなのかわからないものも含めて) 明記されていなかったりもします。ということで、 HTML 4 DTD と XHTML 1.0 DTD の違いを調べてみました。 SE で HTML 4 式に復元している部分もある都合上、 FE から SE での変更点もあわせてまとめています。 (というわけで、この文章は、 HTML 4 から XHTML 1.0 でおおまかにどう変わったのかを知りたい方のお役には立ちません。 その辺は W3C の仕様書がわかりやすく解説していますから、そちらをお読みください。) [37] 以降の検証で使用する DTD は、次の場所から入手できます。 Transitional/Frameset や FE/SE の別に触れずに XHTML 1.0 という場合は、両方の DTD で差がないことをあらわすとします。 - [[HTML 4.01]] Transitional/Frameset DTD - XHTML 1.0 (FE) Transitional DTD - XHTML 1.0 (FE) Frameset DTD - XHTML 1.0 SE Transitional DTD - XHTML 1.0 SE Frameset DTD なお、ここでは、実際上問題となる変更だけを取り上げています。 さほど影響のない引数実体の増減や DTD 中の宣言の順序など編集上の問題程度の変更は一々取り上げません。 * データ型 [2] [%LanguageCode] 引数実体 [CODE(SGML)[LanguageCode]] は [CODE(SGML)[[[NAME]]]] から [CODE(XML)[[[NMTOKEN]]]] になりました。 ([[XML]] に [CODE(SGML)[NAME]] がないため。) [3] [%FrameTarget] 引数実体 [CODE(SGML)[FrameTarget]] は [CODE(SGML)[[[CDATA]]]] から [CODE(XML)[[[NMTOKEN]]]] になりました。 (後述の通り、 [CODE(HTMLa)[name]] 属性の型もあわせて変化しています。) [12] [%Number] HTML 4 で属性の型が [CODE(SGML)[[[NUMBER]]]] とされていたところは悉く XHTML 1.0 では [CODE(XML)[%Number;]] に置き換えられています。 XHTML 1.0 の引数実体 [CODE[Number]] の実体値は [CODE(XML)[CDATA]] です。 ([CODE(XML)[[[NMTOKEN]]]] の方が元の宣言に近いと思うのですが...) [14] [%UriList] 引数実体 [CODE(SGML)[UriList]] が XHTML 1.0 で追加されました。 [CODE(HTMLe)[[[object]]]] 要素の [CODE(HTMLa)[[[archive]]]] 属性の宣言が [CODE(SGML)[[[CDATA]]]] から [CODE(XML)[%UriList;]] に変更されています。 (展開すれば結局 [CODE(XML)[CDATA]] で変わりありませんが。) * 属性 [4] [@xml:lang] 属性集合 [CODE[%i18n]] に [CODE(XML)[xml:lang %LanguageCode; #IMPLIED]] が加わりました。 (要素型 [CODE(HTMLe)[[[html]]]], [CODE(HTMLe)[[[head]]]], [CODE(HTMLe)[[[title]]]], [CODE(HTMLe)[[[meta]]]], [CODE(HTMLe)[[[style]]]], [CODE(HTMLe)[[[font]]]], [CODE(HTMLe)[[[map]]]], [CODE(HTMLe)[[[isindex]]]], 属性集合 [CODE[%attrs]] が影響を受けます。 属性集合 [CODE[%attrs]] を通して要素型 [CODE(HTMLe)[[[link]]]], [CODE(HTMLe)[[[noscript]]]], [CODE(HTMLe)[[[noframes]]]], [CODE(HTMLe)[[[body]]]], [CODE(HTMLe)[[[div]]]], [CODE(HTMLe)[[[p]]]], [CODE(HTMLe)[[[h1]]]], [CODE(HTMLe)[[[h2]]]], [CODE(HTMLe)[[[h3]]]], [CODE(HTMLe)[[[h4]]]], [CODE(HTMLe)[[[h5]]]], [CODE(HTMLe)[[[h6]]]], [CODE(HTMLe)[[[ul]]]], [CODE(HTMLe)[[[ol]]]], [CODE(HTMLe)[[[menu]]]], [CODE(HTMLe)[[[dir]]]], [CODE(HTMLe)[[[li]]]], [CODE(HTMLe)[[[dl]]]], [CODE(HTMLe)[[[dt]]]], [CODE(HTMLe)[[[dd]]]], [CODE(HTMLe)[[[address]]]], [CODE(HTMLe)[[[hr]]]], [CODE(HTMLe)[[[pre]]]], [CODE(HTMLe)[[[blockquote]]]], [CODE(HTMLe)[[[center]]]], [CODE(HTMLe)[[[ins]]]], [CODE(HTMLe)[[[del]]]], [CODE(HTMLe)[[[a]]]], [CODE(HTMLe)[[[span]]]], [CODE(HTMLe)[[[em]]]], [CODE(HTMLe)[[[strong]]]], [CODE(HTMLe)[[[dfn]]]], [CODE(HTMLe)[[[code]]]], [CODE(HTMLe)[[[samp]]]], [CODE(HTMLe)[[[kbd]]]], [CODE(HTMLe)[[[var]]]], [CODE(HTMLe)[[[cite]]]], [CODE(HTMLe)[[[abbr]]]], [CODE(HTMLe)[[[acronym]]]], [CODE(HTMLe)[[[q]]]], [CODE(HTMLe)[[[sub]]]], [CODE(HTMLe)[[[sup]]]], [CODE(HTMLe)[[[tt]]]], [CODE(HTMLe)[[[i]]]], [CODE(HTMLe)[[[b]]]], [CODE(HTMLe)[[[big]]]], [CODE(HTMLe)[[[small]]], [CODE(HTMLe)[[[u]]]], [CODE(HTMLe)[[[s]]]], [CODE(HTMLe)[[[strike]]]], [CODE(HTMLe)[[[object]]]], [CODE(HTMLe)[[[img]]]], [CODE(HTMLe)[[[area]]]], [CODE(HTMLe)[[[form]]]], [CODE(HTMLe)[[[label]]]], [CODE(HTMLe)[[[input]]]], [CODE(HTMLe)[[[select]]]], [CODE(HTMLe)[[[optgroup]]]], [CODE(HTMLe)[[[option]]]], [CODE(HTMLe)[[[textarea]]]], [CODE(HTMLe)[[[fieldset]]]], [CODE(HTMLe)[[[legend]]]], [CODE(HTMLe)[[[button]]]], [CODE(HTMLe)[[[table]]]], [CODE(HTMLe)[[[caption]]]], [CODE(HTMLe)[[[colgroup]]]], [CODE(HTMLe)[[[col]]]], [CODE(HTMLe)[[[thead]]]], [CODE(HTMLe)[[[tbody]]]], [CODE(HTMLe)[[[tfoot]]]], [CODE(HTMLe)[[[tr]]]], [CODE(HTMLe)[[[th]]]], [CODE(HTMLe)[[[td]]]] が影響を受けます。) また、 [CODE(HTMLe)[[[bdo]]]] 要素型にも属性 [CODE(XML)[xml:lang %LanguageCode; #IMPLIED]] が追加されています。 [5] [@data*] 引数実体 [CODE(SGML)[HTML.Reserved]] が [CODE(SGML)[[[INCLUDE]]]] の時有効だった属性集合 [CODE[%reserved]] がなくなりました。 つまり、 HTML 4 で予約とされていた [[WinIE]] 拡張の [CODE(HTMLa)[[[data[VAR[*]]]]]] 系属性は XHTML 1.0 では使えません。 (要素型 [CODE(HTMLe)[[[div]]]], [CODE(HTMLe)[[[span]]]], [CODE(HTMLe)[[[object]]]], [CODE(HTMLe)[[[input]]]], [CODE(HTMLe)[[[select]]]], [CODE(HTMLe)[[[textarea]]]], [CODE(HTMLe)[[[button]]]], [CODE(HTMLe)[[[table]]]] が影響を受けます。) [18] [table/@datapagesize] [CODE(HTMLe)[table]] 要素型で HTML 4 の時には予約されていた [CODE(HTMLa)[datapagesize]] 属性が XHTML 1.0 にはありません。 [6] [html/@xmlns] [CODE(HTMLe)[[[html]]]] 要素型に属性 [CODE(XML)[xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml']] が加わりました。 [7] [html/@version] [CODE(HTMLe)[html]] 要素型の属性 [CODE(HTMLa)[[[version]]]] は削除されました。 ([CODE(XMLa)[xmlns]] があるのでお役御免ということでしょうか。) [8] [@id] XHTML 1.0 SE で、 要素型 [CODE(HTMLe)[html]], [CODE(HTMLe)[[[head]]]], [CODE(HTMLe)[[[title]]]], [CODE(HTMLe)[[[base]]]], [CODE(HTMLe)[[[meta]]]], [CODE(HTMLe)[[[style]]]], [CODE(HTMLe)[[[script]]]] に属性 [CODE(XML)[id ID #IMPLIED]] が追加されました。 [CODE(HTMLe)[style]] 要素については、仕様書に [CODE(XML)[[[xml-stylesheet]]]] 処理指令から参照する例が載っています 。 (これに使うために [CODE(HTMLe)[style]] に追加されて、 他の要素型にもついでに追加したのでしょう。) 仕様書初版訂正票 に [Q[Changes include the [CODE(HTMLa)[id]] attribute on all elements, which was missing in some elements.]] と言及がありました。 [9] [@xml:space] 要素型 [CODE(HTMLe)[style]], [CODE(HTMLe)[script]], [CODE(HTMLe)[[[pre]]]] に属性 [CODE(XML)[xml:space (preserve) #FIXED 'preserve']] が追加されました。 [11] [script/@event, script/@for] HTML 4 の [CODE(HTMLe)[[[script]]]] 要素型で予約されていた属性 [CODE(HTMLa)[[[event]]]] および [CODE(HTMLa)[[[for]]]] は XHTML 1.0 にはありません。 [10] [meta/@name, meta/@http-equiv の型] [CODE(HTMLe)[meta]] 要素型の [CODE(HTMLa)[name]] 属性および [CODE(HTMLa)[http-equiv]] 属性の型は、 HTML 4 では [CODE(SGML)[[[NAME]]]] でしたが、 XHTML 1.0 では [CODE(XML)[[[CDATA]]]] です。 ([CODE(XML)[[[NMTOKEN]]]] の方が HTML 4 に近いはず。 [CODE(HTMLa)[name]] はともかく、 [CODE(HTMLa)[http-equiv]] で文字種を拡大する必要性は考えられませんが...) [12] [a/@name, object/@name, iframe/@name, applet/@name, img/@name, form/@name, frame/@name, map/@name] 要素型 [CODE(HTMLe)[a]], [CODE(HTMLe)[[[object]]]], [CODE(HTMLe)[[[iframe]]]], [CODE(HTMLe)[[[applet]]]], [CODE(HTMLe)[[[img]]]], [CODE(HTMLe)[form]], [CODE(HTMLe)[[[frame]]]] の [CODE(HTMLa)[name]] 属性の型は、 HTML 4 では [CODE(SGML)[[[CDATA]]]] でしたが、 XHTML 1.0 では [CODE(XML)[[[NMTOKEN]]]] です。 ([CODE(HTMLe)[frame]] 要素型は Frameset DTD にのみ存在。) [CODE(HTMLe)[map]] 要素の [CODE(HTMLa)[name]] 属性は HTML 4 と XHTML 1.0 Transitional DTD では [CODE(SGML)[CDATA]] で、 XHTML 1.0 Strict DTD と Frameset DTD では [CODE(XML)[NMTOKEN]] です。 (Transitional DTD の修正し忘れか。) [13] [bdo/@{%events}] [CODE(HTMLe)[[[bdo]]]] 要素型に属性集合 [CODE[%events]] が追加されています。 (属性 [CODE(HTMLa)[[[onclick]]]], [CODE(HTMLa)[[[ondblclick]]]], [CODE(HTMLa)[[[onmousedown]]]], [CODE(HTMLa)[[[onmouseup]]]], [CODE(HTMLa)[[[onmouseover]]]], [CODE(HTMLa)[[[onmousemove]]]], [CODE(HTMLa)[[[onmouseout]]]], [CODE(HTMLa)[[[onkeypress]]]], [CODE(HTMLa)[[[onkeydown]]]], [CODE(HTMLa)[[[onkeyup]]]] が追加されました。) [15] [img/@border] [CODE(HTMLe)[img]] 要素型の [CODE(HTMLa)[[[border]]]] 属性の型は HTML 4 と XHTML 1.0 Frameset では [CODE(SGML)[%[[Pixels]];]] ですが、 XHTML 1.0 Transitional では [CODE(XML)[%[[Length]];]] です。 [16] [map/@{%attrs}] [CODE(HTMLe)[map]] 要素型の属性のうち、 HTML 4 では属性集合 [CODE[%attrs]] で宣言されていたものは XHTML 1.0 では展開されて属性集合 [CODE[%i18n]] および [CODE[%events]] ならびに属性 [CODE(HTMLa)[[[id]]]], [CODE(HTMLa)[[[class]]]], [CODE(HTMLa)[[[style]]]], [CODE(HTMLa)[[[title]]]] で宣言しています。 [CODE(HTMLe)[map]] 要素型の [CODE(HTMLa)[id]] 属性は必須になりました。 (これが展開の理由。 本当は XML では[[属性定義]]の重複で最初のものが使われるのを利用すればこんなことしなくても済みますけどもね。) [17] [input/@ismap] [CODE(HTMLe)[input]] 要素の [CODE(HTMLa)[[[ismap]]]] 属性が HTML 4 にはありますが、 XHTML 1.0 にはありません (漏れ?)。 ;; [38] [CITE@en[XHTML2 Working Group Teleconference -- 16 Sep 2009]] ([TIME[2009-09-16 23:43:23 +09:00]] 版) - Steven: ... do you remember if this was deliberate? - Shane: I don't ... my gut feeling is that it's an omission [18] [(th | td)/(@width | @height)] [CODE(HTMLe)[[[th]]]] 要素型および [CODE(HTMLe)[[[td]]]] 要素型の [CODE(HTMLa)[width]] 属性および [CODE(HTMLa)[height]] 属性の型は、 次の表のようになっています。 ,DTD ,Transitional,Frameset ,HTML 4.01 ,[CODE(SGML)[%Length;]],== ,XHTML 1.0 FE,[CODE(XML)[%Pixels;]],[CODE(XML)[%Pixels;]] ,XHTML 1.0 SE,[CODE(XML)[%Length;]],[CODE(XML)[%Pixels;]] XHTML 1.0 SE で HTML 4.01 にあわせようとして、 Frameset DTD を修正し忘れたのではないでしょうか。 [19] [@align=justify] XHTML 1.0 の属性 [CODE[%TextAlign]] (HTML 4 では [CODE[%align]]) の型が FE では [CODE(XML)[(left|center|right)]] でしたが、 SE (と HTML 4) では [CODE(XML)[(left|center|right|justify)]] です。 FE ではもれていたのを復活させただけでしょう。 この変更が影響する要素型は、 [CODE(HTMLe)[div]], [CODE(HTMLe)[p]], [CODE(HTMLe)[h1]], [CODE(HTMLe)[h2]], [CODE(HTMLe)[h3]], [CODE(HTMLe)[h4]], [CODE(HTMLe)[h5]], [CODE(HTMLe)[h6]] です。 * 内容模型 [23] [要素級] 要素級の変遷は次の通りです。 ,要素型,HTML 4.01,XHTML 1.0 FE,XHTML 1.0 SE ,[CODE(HTMLe)[em]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[strong]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[dfn]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[code]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[samp]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[kbd]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[var]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[cite]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[abbr]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,[CODE(HTMLe)[acronym]],[CODE[%phrase]],[CODE[%phrase]],[CODE[%phrase.basic]] ,''[CODE(HTMLe)[q]]'',[CODE[%special]],[CODE[%phrase]],[CODE[%phrase.basic]] ,''[CODE(HTMLe)[sub]]'',[CODE[%special]],[CODE[%phrase]],[CODE[%phrase.extra]] ,''[CODE(HTMLe)[sup]]'',[CODE[%special]],[CODE[%phrase]],[CODE[%phrase.extra]] ,[CODE(HTMLe)[tt]],[CODE[%fontstyle]],[CODE[%fontstyle]],[CODE[%fontstyle.basic]] ,[CODE(HTMLe)[i]],[CODE[%fontstyle]],[CODE[%fontstyle]],[CODE[%fontstyle.basic]] ,[CODE(HTMLe)[b]],[CODE[%fontstyle]],[CODE[%fontstyle]],[CODE[%fontstyle.basic]] ,[CODE(HTMLe)[u]],[CODE[%fontstyle]],[CODE[%fontstyle]],[CODE[%fontstyle.basic]] ,[CODE(HTMLe)[s]],[CODE[%fontstyle]],[CODE[%fontstyle]],[CODE[%fontstyle.basic]] ,[CODE(HTMLe)[strike]],[CODE[%fontstyle]],[CODE[%fontstyle]],[CODE[%fontstyle.basic]] ,[CODE(HTMLe)[big]],[CODE[%fontstyle]],[CODE[%fontstyle]],[CODE[%fontstyle.extra]] ,[CODE(HTMLe)[small]],[CODE[%fontstyle]],[CODE[%fontstyle]],[CODE[%fontstyle.extra]] ,''[CODE(HTMLe)[font]]'',[CODE[%special]],[CODE[%fontstyle]],[CODE[%fontstyle.extra]] ,''[CODE(HTMLe)[basefont]]'',[CODE[%special]],[CODE[%fontstyle]],[CODE[%fontstyle.extra]] ,[CODE(HTMLe)[span]],[CODE[%special]],[CODE[%special]],[CODE[%special.basic]] ,[CODE(HTMLe)[bdo]],[CODE[%special]],[CODE[%special]],[CODE[%special.basic]] ,[CODE(HTMLe)[br]],[CODE[%special]],[CODE[%special]],[CODE[%special.basic]] ,[CODE(HTMLe)[object]],[CODE[%special]],[CODE[%special]],[CODE[%special.extra]] ,[CODE(HTMLe)[applet]],[CODE[%special]],[CODE[%special]],[CODE[%special.extra]] ,[CODE(HTMLe)[img]],[CODE[%special]],[CODE[%special]],[CODE[%special.extra]] ,[CODE(HTMLe)[map]],[CODE[%special]],[CODE[%special]],[CODE[%special.extra]] ,[CODE(HTMLe)[iframe]],[CODE[%special]],[CODE[%special]],[CODE[%special.extra]] ,[CODE(HTMLe)[input]],[CODE[%formctrl]],[CODE[%inline.forms]],[CODE[%inline.forms]] ,[CODE(HTMLe)[select]],[CODE[%formctrl]],[CODE[%inline.forms]],[CODE[%inline.forms]] ,[CODE(HTMLe)[textarea]],[CODE[%formctrl]],[CODE[%inline.forms]],[CODE[%inline.forms]] ,[CODE(HTMLe)[label]],[CODE[%formctrl]],[CODE[%inline.forms]],[CODE[%inline.forms]] ,[CODE(HTMLe)[button]],[CODE[%formctrl]],[CODE[%inline.forms]],[CODE[%inline.forms]] ,''[CODE(HTMLe)[a]]'',[CODE[%special]],[CODE[%inline]],[CODE[%inline]] ,[CODE[%phrase]],[CODE[%inline]],[CODE[%inline]],[CODE[%inline]] ,[CODE[%phrase.basic]],−,−,[CODE[%phrase]] ,[CODE[%phrase.extra]],−,−,[CODE[%phrase]] ,[CODE[%fontstyle]],[CODE[%inline]],[CODE[%inline]],[CODE[%inline]] ,[CODE[%fontstyle.basic]],−,−,[CODE[%fontstyle]] ,[CODE[%fontstyle.extra]],−,−,[CODE[%fontstyle]] ,[CODE[%special]],[CODE[%inline]],[CODE[%inline]],[CODE[%inline]] ,[CODE[%special.basic]],−,−,[CODE[%special]] ,[CODE[%special.extra]],−,−,[CODE[%special]] ,[CODE[%formctrl]],[CODE[%inline]],−,− ,[CODE[%inline.forms]],−,[CODE[%inline]],[CODE[%inline]] ,[CODE[%inline]],[CODE[%flow]],"[CODE[%Inline]], [CODE[%Flow]]","[CODE[%Inline]], [CODE[%Flow]]" ,[CODE[%Inline]],−,, ,[CODE(SGML)[#PCDATA]],[CODE[%inline]],"[CODE[%Inline]], [CODE[%Flow]]","[CODE[%Inline]], [CODE[%Flow]]" ,要素型,HTML 4.01,XHTML 1.0 FE,XHTML 1.0 SE ,[CODE(HTMLe)[p]],[CODE[%block]],[CODE[%block]],[CODE[%block]] ,[CODE(HTMLe)[div]],[CODE[%block]],[CODE[%block]],[CODE[%block]] ,[CODE(HTMLe)[fieldset]],[CODE[%block]],[CODE[%block]],[CODE[%block]] ,[CODE(HTMLe)[table]],[CODE[%block]],[CODE[%block]],[CODE[%block]] ,[CODE(HTMLe)[isindex]],[CODE[%block]],[CODE[%block]],[CODE[%block]] ,''[CODE(HTMLe)[pre]]'',[CODE[%preformatted]],[CODE[%blocktext]],[CODE[%blocktext]] ,[CODE(HTMLe)[blockquote]],[CODE[%block]],[CODE[%blocktext]],[CODE[%blocktext]] ,[CODE(HTMLe)[address]],[CODE[%block]],[CODE[%blocktext]],[CODE[%blocktext]] ,[CODE(HTMLe)[center]],[CODE[%block]],[CODE[%blocktext]],[CODE[%blocktext]] ,[CODE(HTMLe)[noframes]],[CODE[%block]],[CODE[%blocktext]][SUP[注]],[CODE[%blocktext]][SUP[注]] ,[CODE(HTMLe)[hr]],[CODE[%block]],[CODE[%blocktext]],[CODE[%blocktext]] ,[CODE(HTMLe)[ul]],[CODE[%list]],[CODE[%lists]],[CODE[%lists]] ,[CODE(HTMLe)[ol]],[CODE[%list]],[CODE[%lists]],[CODE[%lists]] ,[CODE(HTMLe)[dir]],[CODE[%list]],[CODE[%lists]],[CODE[%lists]] ,[CODE(HTMLe)[menu]],[CODE[%list]],[CODE[%lists]],[CODE[%lists]] ,''[CODE(HTMLe)[dl]]'',[CODE[%block]],[CODE[%lists]],[CODE[%lists]] ,[CODE(HTMLe)[h1]],[CODE[%heading]],[CODE[%heading]],[CODE[%heading]] ,[CODE(HTMLe)[h2]],[CODE[%heading]],[CODE[%heading]],[CODE[%heading]] ,[CODE(HTMLe)[h3]],[CODE[%heading]],[CODE[%heading]],[CODE[%heading]] ,[CODE(HTMLe)[h4]],[CODE[%heading]],[CODE[%heading]],[CODE[%heading]] ,[CODE(HTMLe)[h5]],[CODE[%heading]],[CODE[%heading]],[CODE[%heading]] ,[CODE(HTMLe)[h6]],[CODE[%heading]],[CODE[%heading]],[CODE[%heading]] ,[CODE(HTMLe)[form]],[CODE[%block]],"[CODE[%Block]], [CODE[%Flow]]","[CODE[%Block]], [CODE[%Flow]]" ,[CODE[%heading]],[CODE[%block]],[CODE[%block]],[CODE[%block]] ,[CODE[%list]],[CODE[%block]],−,− ,[CODE[%lists]],−,[CODE[%block]],[CODE[%block]] ,[CODE[%blocktext]],−,[CODE[%block]],[CODE[%block]] ,[CODE[%preformatted]],[CODE[%block]],−,− ,[CODE[%block]],[CODE[%flow]],"[CODE[%Block]], [CODE[%Flow]]","[CODE[%Block]], [CODE[%Flow]]" ,[CODE[%Block]],−,, 注: [CODE(HTMLe)[noframes]] 要素型は XHTML 1.0 Frameset DTD では [CODE[%blocktext]] に含まれません。 ,要素型,HTML 4.01,XHTML 1.0 FE,XHTML 1.0 SE ,''[CODE(HTMLe)[ins]]'',"[CODE(HTMLe)[body]]",[CODE[%misc]],[CODE[%misc.inline]] ,''[CODE(HTMLe)[del]]'',[CODE(HTMLe)[body]],[CODE[%misc]],[CODE[%misc.inline]] ,''[CODE(HTMLe)[script]]'',''[CODE[%special]]'',[CODE[%misc]],[CODE[%misc.inline]] ,''[CODE(HTMLe)[noscript]]'',[CODE[%block]],[CODE[%misc]],[CODE[%misc]] ,''[CODE[%misc]]'',−,"[CODE[%Inline]], [CODE[%Block]], [CODE[%Flow]]","[CODE[%Block]], [CODE[%Flow]]" ,[CODE[%misc.inline]],−,−,"[CODE[%misc]], [CODE[%Inline]]" ,[CODE[%flow]],,−,− ,[CODE[%Flow]],−,, [CODE(HTMLe)[ins]] と [CODE(HTMLe)[del]] は、 HTML 4 DTD では [CODE(HTMLe)[body]] への[[添加要素]]となっていましたが、 XML DTD ではこれは表現できないので、 XHTML 1.0 DTD では [CODE[%misc]] に入っています。 (HTML 4 DTD では [CODE(HTMLe)[ul]] などで両要素型が[[除外要素]]になっていない問題がありましたが、 XHTML 1.0 DTD では本来の意図通りになっています。) [CODE[%special]] ⊂ [CODE[%inline]] の要素であった [CODE(HTMLe)[script]] は [CODE[%misc.inline]] ⊂ [CODE[%misc]] ⊂ [CODE[%Inline]], [CODE[%Block]] に移動していますが、 Transitional で影響が出るのは [CODE(HTMLe)[map]] だけです。 Strict では更に [CODE(HTMLe)[noscript]] にも影響が及びます。 HTML 4 では [CODE(HTMLe)[script]] が子供として認められませんでしたが、 XHTML 1.0 では認められます。 [CODE(HTMLe)[noscript]] 要素の属する [CODE[%misc]] は XHTML 1.0 FE では [CODE[%Inline]] に含まれていましたが、 SE では含まれていません。 HTML 4 では [CODE(HTMLe)[noscript]] はブロック水準要素でしたから、 SE の方が正しい処置です。 FE で誤って [CODE(HTMLe)[noscript]] が認められていた要素型は次の通り: [CODE(HTMLe)[a]], [CODE(HTMLe)[button]], [CODE(HTMLe)[p]], [CODE(HTMLe)[h1]], [CODE(HTMLe)[h2]], [CODE(HTMLe)[h3]], [CODE(HTMLe)[h4]], [CODE(HTMLe)[h5]], [CODE(HTMLe)[h6]], [CODE(HTMLe)[dt]], [CODE(HTMLe)[span]], [CODE(HTMLe)[bdo]], [CODE(HTMLe)[em]], [CODE(HTMLe)[strong]], [CODE(HTMLe)[dfn]], [CODE(HTMLe)[code]], [CODE(HTMLe)[samp]], [CODE(HTMLe)[kbd]], [CODE(HTMLe)[var]], [CODE(HTMLe)[cite]], [CODE(HTMLe)[abbr]], [CODE(HTMLe)[acornym]], [CODE(HTMLe)[q]], [CODE(HTMLe)[sub]], [CODE(HTMLe)[sup]], [CODE(HTMLe)[tt]], [CODE(HTMLe)[i]], [CODE(HTMLe)[b]], [CODE(HTMLe)[u]], [CODE(HTMLe)[s]], [CODE(HTMLe)[strike]], [CODE(HTMLe)[big]], [CODE(HTMLe)[small]], [CODE(HTMLe)[font]], [CODE(HTMLe)[label]], [CODE(HTMLe)[legend]], [CODE(HTMLe)[caption]]。 [20] [head] [CODE(HTMLe)[head]] 要素の内容模型は、 HTML 4 では [CODE(SGML)[]], [CODE(SGML)[]] を踏まえて [CODE(SGML)[(%head.content;) +(%head.misc;)]] でした。 XHTML 1.0 では、 [CODE(XML)[]] および [CODE(XML)[(%head.misc;, ((title, %head.misc;, (base, %head.misc;)?) | (base, %head.misc;, (title, %head.misc;))))]] と定義されています。 SGML の [CODE(SGML)[&]] ([CODE(SGML)[[[and]]]]) が XML では使えないので複雑になっていますが、実際上の変化は、 [CODE(HTMLe)[isindex]] の最大個数の変化です。 HTML 4 では高々1個だったのが、 XHTML 1.0 では任意個認められています。 (内容模型が必要以上に複雑になるより多少制限を緩めることにしたのでしょう。 実際 [CODE(HTMLe)[isindex]] は [CODE(HTMLe)[body]] 内に何個でも書けますから、 数を制限することに意味はないでしょうし。) これを受けて [CODE(HTMLe)[title]] 要素型の宣言が HTML 4 の [CODE(SGML)[(#PCDATA) -(%head.misc;)]] から XHTML 1.0 の [CODE(XML)[(#PCDATA)]] に変わっています。 [21] [script, style] [CODE(HTMLe)[script]] 要素型と [CODE(HTMLe)[style]] 要素型は、 HTML 4 では内容が [CODE[%StyleSheet]] および [CODE[%Script]] として定義されていました。いずれも実体は [CODE(SGML)[CDATA]] です。 XML では CDATA 内容が使えないので、いずれも [CODE(XML)[(#PCDATA)]] に改められています。 [22] [table] [CODE(HTMLe)[table]] 要素型の内容模型が [CODE(SGML)[(CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)]] から [CODE(XML)[(caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))]] に変わりました。つまり、 [CODE(HTMLe)[table]] 直下に [CODE(HTMLe)[tbody]] なしで [CODE(HTMLe)[tr]] を置けるようになりました。 [24] [noframes] Frameset DTD では、 [CODE(HTMLe)[noframes]] 要素型の内容は [CODE(SGML)[(BODY) -(NOFRAMES)]] と宣言されていましたが、 [CODE(XML)[%Flow;]] に変わりました。つまり、 XHTML 1.0 Frameset DTD を使うときは、 [CODE(HTMLe)[noframes]] 要素に [CODE(HTMLe)[body]] タグを書くことはできません。 [25] [address] [CODE(HTMLe)[address]] 要素の内容は、 HTML 4 では [CODE(SGML)[((%inline;)|P)*]] でしたが、 XHTML 1.0 FE で [CODE(XML)[%Inline;]] (Strict DTD と同じ) になりました。しかし、 XHTML 1.0 SE で [CODE(XML)[(#PCDATA | %inline; | %misc.inline; | p)*]] に修正されました。 (HTML 4 と同じでないのは XML DTD の表現能力のため。) [26] [dir, menu] [CODE(HTMLe)[[[dir]]]] 要素と [CODE(HTMLe)[[[menu]]]] 要素の子の [CODE(HTMLe[li]] 要素の子孫に[[ブロック水準要素]]を入れることは HTML 4 DTD では禁止されていましたが、 XML DTD では表現できないので、 XHTML 1.0 DTD では禁止されていません。 [27] [label] [CODE(HTMLe)[label]] 要素型の内容は、 HTML 4 DTD では [CODE(SGML)[(%inline;)* -(LABEL)]] でした。 XML DTD では除外要素指定ができないので、 XHTML 1.0 DTD では [CODE(XML)[%Inline;]] と宣言されています。 直前の注釈宣言に [Q[Label elements shouldn't be nested.]] と書かれています。禁止から [Q[shouldn't]] に格下げ (格上げ?) になったようです。 XHTML 1.0 は仕様書の附属書 B で子孫要素として [CODE(HTMLe)[label]] 要素が出現することを禁じられています。 [28] [frameset] Frameset DTD の [CODE(HTMLe)[[[frameset]]]] 要素型は、 HTML 4 DTD では [CODE(SGML)[((FRAMESET|FRAME)+ & NOFRAMES?)]] と宣言されていました。 XHTML 1.0 DTD では [CODE(XML)[(frameset|frame|noframes)*]] です。 つまり、 HTML 4 では [CODE(HTMLe)[frameset]] または [CODE(HTMLe)[frame]] が最低1つ必要でしたが、 XHTML 1.0 DTD ではそうではありません。 [CODE(HTMLe)[noframes]] は高々1個でしたが、 XHTML 1.0 DTD では任意個認められます。しかも、 HTML 4 では [CODE(HTMLe)[frameset]] の最初か最後だったのか、 XHTML 1.0 DTD では他の要素の間にも置けることになります。 [29] [a] [CODE(HTMLe)[a]] 要素型の内容は、 [CODE(SGML)[(%inline;)* -(A)]] から [CODE(XML)[%a.content;]] に変わりました。 [CODE[%a.content]] は、 FE では [CODE(XML)[(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc;)*]]、 SE では [CODE(XML)[(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*"]] です。 実際の変化は、 FE で誤って認められていた [CODE(HTMLe)[noscript]] が SE で認められなくなっただけです。 XHTML 1.0 SE DTD の定義は、孫以下の要素が [CODE(HTMLe)[a]] になることを禁止していないほかは HTML 4 と同じ定義になります。 XHTML 1.0 では子孫要素として [CODE(HTMLe)[a]] 要素が出現することは仕様書の附属書 B で禁じられています。 [30] [pre] [CODE(HTMLe)[pre]] 要素型の内容は、 HTML 4 では [CODE(SGML)[(%inline;)* -(%pre.exclusion;)]] + [CODE(SGML)[]] と定義されていました。 XHTML 1.0 では [CODE(XML)[%pre.content;]] でして、 FE では [CODE(XML)[(#PCDATA | a | br | span | bdo | map | tt | i | b | u | s | %phrase; | %inline.forms;)*]]、 SE では [CODE(XML)[(#PCDATA | a | %special.basic; | %fontstyle.basic; | %phrase.basic; | %inline.forms; | %misc.inline;)*]]、 です。 [CODE(HTMLe)[pre]] 要素の子要素に対する影響は次の通りです。 ,要素型,HTML 4.01 Strict / Transitional / Frameset,XHTML 1.0 FE Strict / Transitional / Frameset,XHTML 1.0 SE Transitional / Frameset,XHTML 1.0 SE Strict ,"[CODE[%phrase.extra]] ([CODE(HTMLe)[sub]], [CODE(HTMLe)[sup]])",×,○,×,○ ,[CODE(HTMLe)[strike]],○,×,○,○ ,"その他 [CODE[%fontstyle.basic]] ([CODE(HTMLe)[tt]], [CODE(HTMLe)[i]], [CODE(HTMLe)[b]], [CODE(HTMLe)[u]], [CODE(HTMLe)[s]])",○,○,○,○ ,"[CODE[%fontstyle.extra]] ([CODE(HTMLe)[big]], [CODE(HTMLe)[small]], [CODE(HTMLe)[font]], [CODE(HTMLe)[basefont]])",×,×,×,○ ,[CODE(HTMLe)[map]],○,○,×,○ ,[CODE(HTMLe)[iframe]],○,×,×,− ,"その他 [CODE[%special.extra]] ([CODE(HTMLe)[object]], [CODE(HTMLe)[applet]], [CODE(HTMLe)[img]])",×,×,×,× ,"[CODE[%misc.inline]] ([CODE(HTMLe)[ins]], [CODE(HTMLe)[del]], [CODE(HTMLe)[script]])",○,×,○,○ ,その他 [CODE[%inline]],○,○,○,○ ,その他,×,×,×,× 注: ○がついていても、 Strict DTD ではもともと使えない要素型もあります。 SE の変更のほとんどは FE の虫取りのようです。 [CODE(HTMLe)[map]] と [CODE(HTMLe)[iframe]] は HTML 4 の虫取りでしょう。 XHTML 1.0 では仕様書の附属書 B で子孫要素として [CODE(HTMLe)[img]], [CODE(HTMLe)[object]], [CODE(HTMLe)[big]], [CODE(HTMLe)[small]], [CODE(HTMLe)[sub]], [CODE(HTMLe)[sup]] 要素が出現することを禁じられています。 附属書 B と DTD のどちらも normative ですので、矛盾があるのは困りものです。 [31] [form] [CODE(HTMLe)[form]] 要素は、 HTML 4 では [CODE(SGML)[(%flow;)* -(FORM)]] でした。 XHTML 1.0 では [CODE(XML)[%form.content;]] で、 [Q[forms shouldn't be nested]] と注釈されています。 FE でも SE でも、 [CODE(XML)[]] です。子孫 [CODE(HTMLe)[form]] 以外は HTML 4 と同じです。 XHTML 1.0 は仕様書の附属書 B で子孫要素として [CODE(HTMLe)[form]] 要素が出現することを禁じられています。 [32] [button] [CODE(HTMLe)[button]] 要素は、 HTML 4 では [CODE(SGML)[(%flow;)* -(A|%formctrl;|FORM|ISINDEX|FIELDSET|IFRAME)]]、 XHTML 1.0 では [CODE(XML)[%button.content;]] です。 [PRE(XML)[ ]PRE] ですから、子要素の制約としては HTML 4 と XHTML 1.0 は同じです。 XHTML 1.0 は仕様書の附属書 B で子孫要素として [CODE[%inline.formctrl]], [CODE(HTMLe)[fieldset]], [CODE(HTMLe)[iframe]], [CODE(HTMLe)[isindex]] の要素が出現することを禁じられています。 [33] [fieldset] [CODE(HTMLe)[fieldset]] 要素は、 HTML 4 では [CODE(SGML)[(#PCDATA,LEGEND,(%flow;)*)]] で、 [Q[#PCDATA is to solve the mixed content problem, per specification only whitespace is allowed there!]] という注釈がありました。 XHTML 1.0 では [CODE(XML)[(#PCDATA | legend | %block; | form | %inline; | %misc;)*]] で、 [Q[if present should only be preceded by whitespace]] という注釈に、やはりトーンダウンしています。 XML DTD の制約で [CODE(HTMLe)[[[legend]]]] の位置と個数がまったく固定できなくなった他は両規格は同じです。 [34] [map] [CODE(HTMLe)[map]] 要素は、 HTML 4 では [CODE(SGML)[((%block;) | AREA)+]]、 XHTML 1.0 では [CODE(SGML)[((%block; | form | %misc;)+ | area+)]] です。 XHTML 1.0 では [CODE(HTMLe)[area]] とそれ以外の混在が認められなくなりました (なぜ?)。 [35] [object, applet] [CODE(HTMLe)[object]] 要素と [CODE(HTMLe)[applet]] 要素は HTML 4 では [CODE(SGML)[(PARAM | %flow;)*]]、 XHTML 1.0 では [CODE(XML)[(#PCDATA | param | %block; | form | %inline; | %misc;)*]] です。 実際上の制約としてはどちらも同じです。 * Strict DTD [36] 本稿では Transitional DTD と Frameset DTD を扱ってきましたが、 簡単に Strict DTD にも触れておきましょう。 Transitional DTD の HTML 4.01 から XHTML 1.0 への変更点のうち Strict DTD と共通した部分のものは Strict DTD にも反映されています。そのほか、 [CODE(HTMLe)[[[param]]]] 要素型の [CODE(HTMLa)[name]] 属性が必須でなくなっています。 (Transitional DTD も HTML 4 Strict DTD も必須にしているので、 間違いかもしれませんが、 FE でも SE でも Strict DTD だけでは必須でありません。) HTML 4.01 には Strict でも存在する [CODE(HTMLe)[img]] 要素の [CODE(HTMLa)[name]] 属性は、 XHTML 1.0 にはありません。 (わざわざ注釈が付いていますから、意図したものでしょう。) [CODE(HTMLe)[form]] 要素の [CODE(HTMLa)[name]] 属性も、同じく HTML 4.01 にはあって XHTML 1.0 にありません。 Transitional DTD の XHTML 1.0 FE から SE への変更点のうち Strict DTD と共通した部分のものは Strict DTD にも反映されています。ただし、 [CODE[%phrase.extra]] などの要素型級の細分化は独自に行われています。 (この影響が出るのは [CODE(HTMLe)[pre]] 要素だけで (というより [CODE(HTMLe)[pre]] 要素のための修正で)、それについては >>30 で扱っています。) [CODE(HTMLe)[base]] 要素の [CODE(HTMLa)[href]] 属性は FE では省略可能でしたが、 (HTML 4 と) SE では必須です。 SE の大きな変更点はこれと [CODE(HTMLa)[id]] 属性 (>>8) です。簡単な変更ばかりなので、詳しくは [KBD[[[diff]]]] をとってみてください。 * メモ