1. 13 HTML構文
    1. 13.1 HTML文書を記述する
      1. 13.1.1 DOCTYPE
      2. 13.1.2 要素
        1. 13.1.2.1 開始タグ
        2. 13.1.2.2 終了タグ
        3. 13.1.2.3 属性
        4. 13.1.2.4 任意のタグ
        5. 13.1.2.5 コンテンツモデルの制約
        6. 13.1.2.6 生テキストおよびエスケープ可能な生テキスト要素のコンテンツの制約
      3. 13.1.3 テキスト
        1. 13.1.3.1 改行
      4. 13.1.4 文字参照
      5. 13.1.5 CDATAセクション
      6. 13.1.6 コメント

13 HTML構文

このセクションは、HTML MIMEタイプで標識されたリソースのための規則のみを説明する。XMLリソースのための規則は、"XML構文"と題する以降のセクションで説明する。

13.1 HTML文書を記述する

指定された順序で、文書は以下のパーツから構成されなければならない。

  1. 任意で、単一のU+FEFF BYTE ORDER MARK(BOM)文字。
  2. 任意の数のコメントおよびASCII空白文字
  3. DOCTYPE
  4. 任意の数のコメントおよびASCII空白文字
  5. html要素の形式で、文書要素
  6. 任意の数のコメントおよびASCII空白文字

上記のさまざまな種類のコンテンツは、以下の数セクションで説明される。

また、そのトピックのセクションで説明したように、文字エンコーディング宣言がシリアライズされる方法にはいくつかの制限がある。

文書が解析されるときに、html要素の前、html要素の冒頭、およびhead要素の前のASCII空白文字は、落とされる。あたかもASCII空白文字がbody要素の最後であるかのように、html要素のASCII空白文字は解析される。したがって、文書要素の周りのASCII空白文字は、ラウンドトリップしない。

これは、改行がDOCTYPEの後、文書要素の前にある任意のコメントの後、(省略されていない場合)html要素の開始タグの後、およびhead要素の前を除くhtml要素の内部にある任意のコメントの後に挿入されることが示唆される。

HTML構文において、多くの文字列(たとえば要素名とその属性名など)は大文字・小文字不区別であるが、ASCII大文字ASCII小文字に対してのみである。便宜上、このセクションにおいて、これは単に"大文字・小文字不区別"とも呼ばれる。

13.1.1 DOCTYPE

DOCTYPEは必須のプリアンブルである。

DOCTYPEは時代に合わなくなった理由のために必要である。省略した場合、ブラウザーは一部の仕様と互換性のない異なるレンダリングモードを使用する傾向がある。文書内でDOCTYPEを含めることは、ブラウザーが以下の関連仕様でベストエフォートな試みをすることを保証する。

次の順序で、DOCTYPEは以下のコンポーネントで構成されなければならない:

  1. "<!DOCTYPE"に一致するASCII大文字・小文字不区別の文字列。
  2. 1個以上のASCII空白文字
  3. "html"に一致するASCII大文字・小文字不区別の文字列。
  4. 任意で、DOCTYPEレガシー文字列
  5. 0個以上のASCII空白文字
  6. U+003E GREATER-THAN SIGN文字(>)。

言い換えると、大文字・小文字不区別で<!DOCTYPE html>


短いDOCTYPE"<!DOCTYPE html>"でHTMLマークアップを出力できないHTMLの出力器の目的に対して、DOCTYPEレガシー文字列は(上記で定義された位置で)DOCTYPEに挿入してもよい。この文字列は以下で構成されなければならない:

  1. 1個以上のASCII空白文字
  2. "SYSTEM"に一致するASCII大文字・小文字不区別の文字列。
  3. 1個以上のASCII空白文字
  4. U+0022 QUOTATION MARKまたはU+0027 APOSTROPHE文字(引用符)。
  5. リテラルに文字列"about:legacy-compat"。
  6. U+0022 QUOTATION MARKまたはU+0027 APOSTROPHEに一致する文字(すなわち、前のステップで引用符とラベル付けされたものと同じ文字)。

言い換えると、単一または二重引用符の部分を除いて大文字・小文字不区別で、<!DOCTYPE html SYSTEM "about:legacy-compat">または<!DOCTYPE html SYSTEM 'about:legacy-compat'>

文書が短い文字列を出力できないシステムから生成されない限り、DOCTYPEレガシー文字列は使用すべきではない。

13.1.2 要素

6つの異なる種類の要素が存在する。空要素template要素生テキスト要素エスケープ可能な生テキスト要素外来要素通常要素

空要素
area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr
template要素
template
生テキスト要素
scriptstyle
エスケープ可能な生テキスト要素
textareatitle
外来要素
MathML名前空間およびSVG名前空間由来の要素。
通常要素
他の許容されるすべてのHTML要素が通常要素である。

タグは、マークアップで要素の開始と終了を区切るために使用される。生テキストエスケープ可能な生テキスト、および通常要素は、開始する場所を示すための開始タグを持ち、終了する場所を示すための終了タグを持つ。任意タグのセクションで後述するように、特定の通常要素の開始タグおよび終了タグは省略できる。省略できないものは省略してはならない。空要素は開始タグのみを持つ。空要素に対して終了タグは指定してはならない。外来要素は、開始タグと終了タグを持つ、または終了タグを持ってはならない場合、自己終了としてマークされる開始タグのいずれかを持たなければならない。

要素のコンテンツは、開始タグ(特定の場合に暗示されるかもしれない)のちょうど後、終了タグ(再び、特定の場合に暗示されるかもしれない)のちょうど前の間に配置されなければならない。この仕様で以前に説明したように、個々の要素の正確な許可されるコンテンツは、その要素のコンテンツモデルによって異なる。要素は、そのコンテンツモデルが禁止するコンテンツを含めてはならない。また一方、これらコンテンツモデルによってコンテンツに設定される制限に加えて、要素に5種類の追加の構文要件がある。

空要素は、任意のコンテンツを持つことができない(終了タグが存在しないので、コンテンツは開始タグと終了タグの間に置くことができない)。

template要素テンプレートコンテンツを持つことができるが、そのようなテンプレートコンテンツtemplate要素自体の子ではない。代わりに、ブラウジングコンテキストなしで、それらは別のDocumentに関連付けられたDocumentFragmentに保存され、templateのコンテンツがメインのDocumentと干渉するのを避けるようにする。template要素のテンプレートコンテンツのマークアップは、(他の要素と同様に)template要素の開始タグの直後かつtemplate要素の終了タグの直前に配置され、テキスト文字参照要素、およびコメントで構成されてもよいが、 テキストは、文字U+003C LESS-THAN SIGN(<)または曖昧なアンパサンドを含めてはならない。

後述の制限があるが、生テキスト要素は、テキストを持つことができる。

エスケープ可能な要素は、テキストおよび文字参照を持つことができるが、テキストは曖昧なアンパサンドを含めてはならない。後述のさらなる制限もある。

開始タグが自己終了としてマークされる外来要素は、任意のコンテンツを持つことはできない(終了タグが存在しないので、コンテンツは開始タグと終了タグの間に置くことができない)。開始タグが自己終了としてマークされない外来要素は、テキスト文字参照CDATAセクション、他の要素、およびコメントを持つことができるが、テキストは、文字U+003C LESS-THAN SIGN(<)または曖昧なアンパサンドを含めてはならない。

外来要素であっても、HTML構文は、名前空間宣言をサポートしない。

たとえば、次のHTMLコードを考えてみる:

<p>
 <svg>
  <metadata>
   <!-- this is invalid -->
   <cdr:license xmlns:cdr="https://www.example.com/cdr/metadata" name="MIT"/>
  </metadata>
 </svg>
</p>

"xmlns:cdr"属性は効果を持たない(XMLと異なる)ため、内側の要素cdr:licenseは、実際にはSVG名前空間である。むしろ、上記断片のコメントにあるように、この断片は実際には不適合である。これは、SVG2が、SVG名前空間で"cdr:license"と呼ばれる任意の要素を定義しないためである。

通常要素は、テキスト文字参照、他の要素、およびコメントを持つことができるが、テキストは、文字U+003C LESS-THAN SIGN(<)または曖昧なアンパサンドを含めてはならない。一部の通常要素はまた、コンテンツモデルとこの段落で説明されるものによって課される制限を超えて、保持するために許可されるコンテンツでまだ多くの制限を持つ。これらの制限事項は以下のとおり。

タグは、要素の名前を与えるタグ名を含む。HTML要素はすべて、ASCII英数字を使用する名前のみを持つ。HTML構文において、外来要素に対するものでさえ、タグ名は、すべて小文字に変換する場合に、要素のタグ名に一致する小文字と大文字の任意の組み合わせで書かれてもよい。タグ名は、大文字・小文字不区別である。

13.1.2.1 開始タグ

開始タグは、次の形式を持たなければならない:

  1. 開始タグの最初の文字は、U+003C LESS-THAN SIGN文字(<)でなければならない。
  2. 開始タグの次の数文字は、要素のタグ名でなければならない。
  3. 次のステップで、任意の属性が存在する場合、最初に1つ以上のASCII空白文字が存在しなければならない。
  4. 次に、開始タグは、以下で説明される構文を属性の数だけ持ってもよい。属性は、1つ以上のASCII空白文字で区切らなければならない。
  5. 属性の後に、または属性が存在しない場合タグ名の後に、1つ以上のASCII空白文字があってもよい。(一部の属性は、スペースが続くことが要求される。下記の属性セクションを参照のこと。)
  6. 次に、要素が空要素のいずれかである場合、または要素が外来要素である場合、単一のU+002F SOLIDUS文字(/)が存在してもよく、これは、外来要素上で、開始タグを自己終了としてマークする。空要素では、開始タグを自己終了としてマークしないが、不要であり、いかなる種類の効果も持たない。そのような空要素の場合、特に引用符で囲まれていない属性値が直前にある場合、パーサーによって破棄されるのではなく、属性値の一部になるため、注意して使用すべきである。
  7. 最後に、開始タグはU+003E GREATER-THAN SIGN文字(>)で閉じなければならない。
13.1.2.2 終了タグ

終了タグは、次の形式を持たなければならない:

  1. 終了タグの最初の文字は、U+003C LESS-THAN SIGN文字(<)でなければならない。
  2. 終了タグの2番目の文字は、U+002F SOLIDUS文字(/)でなければならない。
  3. 終了タグの次の数文字は、要素のタグ名でなければならない。
  4. タグ名の後に、1つ以上のASCII空白文字があってもよい。
  5. 最後に、終了タグはU+003E GREATER-THAN SIGN文字(>)で閉じなければならない。
13.1.2.3 属性

要素の属性は要素の開始タグの中で表現される。

属性は名前および値を持つ。属性名は、制御文字、U+0020 SPACE、U+0022(")、U+0027(')、U+003E(>)、U+002F(/)、U+003D(=)、および非文字以外の1つ以上の文字で構成されなければならない。HTML構文において、外来要素に対するものでさえ、属性名は、ASCII小文字およびASCII大文字の任意の組み合わせで書かれてもよい。

属性値は、テキストが曖昧なアンパサンドを含めることができない追加の制限をもつ場合を除き、テキストおよび文字参照の混合物である。

属性は、4つの異なる方法で指定できる:

空属性構文

単に属性名。値は、暗黙的に空文字列である。

次の例において、disabled属性は、空属性構文で与えられる:

<input disabled>

空属性構文を使用する属性が別の属性が続ける場合、2つを分離するASCII空白文字が存在しなければならない。

引用符で囲まれない属性値構文

属性名、その後に0個以上のASCII空白文字、その後に1つのU+003D EQUALS SIGN文字、その後に0個以上のASCII空白文字、その後に属性値が続く。この属性値には、上記の属性値の要件に加えて、すべてのリテラルなASCII空白文字、U+0022 QUOTATION MARK文字(")、U+0027 APOSTROPHE文字(')、U+003D EQUALS SIGN文字(=)、U+003C LESS-THAN SIGN文字(<)、U+003E GREATER-THAN SIGN文字(>)、またはU+0060 GRAVE ACCENT文字(`)を含めてはならず、かつ空文字列であってはならない。

次の例において、value属性は、引用符で囲まれない属性値構文で与えられる:

<input value=yes>

引用符で囲まれない属性構文を使用する属性が別の属性に続く、または上記の開始タグ構文のステップ6で許可される任意のU+002F SOLIDUS文字(/)文字が続く場合、2つを分離するASCII空白文字が存在しなければならない。

単一引用符属性値構文

属性名、その後に0個以上のASCII空白文字、その後に1つのU+003D EQUALS SIGN文字、その後に0個以上のASCII空白文字、その後に1つのU+0027 APOSTROPHE文字(')、その後に属性値が続く。この属性値には、属性値に関する上記の要件に加えて、リテラルのU+0027 APOSTROPHE文字(')を含めてはならない。そして最後にもう1つのU+0027 APOSTROPHE文字(')が続く。

次の例において、type属性は、単一引用符で囲まれた属性値構文で与えられる:

<input type='checkbox'>

単一引用符属性構文を使用する属性が別の属性が続ける場合、2つを分離するASCII空白文字が存在しなければならない。

二重引用符属性値の構文

属性名、その後に0個以上のASCII空白文字、その後に1つのU+003D EQUALS SIGN文字、その後に0個以上のASCII空白文字、その後に1つのU+0022 QUOTE MARK文字(")、その後に属性値が続く。この属性値には、属性値に関する上記の要件に加えて、リテラルのU+0022 QUOTATION MARK文字(")を含めてはならない。そして最後にもう1つのU+0022 QUOTATION MARK文字(")が続く。

次の例において、name属性は、二重引用符で囲まれた属性値構文で与えられる:

<input name="be evil">

二重引用符属性構文を使用する属性が別の属性が続ける場合、2つを分離するASCII空白文字が存在しなければならない。

名前が互いにASCII大文字・小文字不区別で一致する同じ開始タグで2つ以上の属性があってはならない。


外来要素が以下の表から行の1番目のローカル名および2番目のセルの名前空間によって与えられた名前空間属性のいずれかが含まれる場合、同じ行から3番目のセルで指定した名前を使用して書かれなければならない。

ローカル名名前空間属性名
actuateXLink名前空間xlink:actuate
arcroleXLink名前空間xlink:arcrole
hrefXLink名前空間xlink:href
roleXLink名前空間xlink:role
showXLink名前空間xlink:show
titleXLink名前空間xlink:title
typeXLink名前空間xlink:type
langXML名前空間xml:lang
spaceXML名前空間xml:space
xmlnsXMLNS名前空間xmlns
xlinkXMLNS名前空間xmlns:xlink

それ以外の名前空間つき属性は、HTML構文で表現できない。

上記の表の属性が適合しているかは、他の仕様(たとえばSVG 2MathMLなど)によって定義される。属性がHTML構文を使用してシリアライズされる場合、このセクションは、構文規則についてのみ説明する。

13.1.2.4 任意のタグ

一部のタグは省略できる。

以下で説明される状況で要素の開始タグを省略することは、要素が存在しないことを意味するものではない。そのように暗示するが、要素は依然としてそこに存在する。たとえば、たとえマークアップのどこにも文字列<html>が出現しない場合でも、HTML文書は常にルートhtml要素を持つ。

html要素内の最初の文がコメントでない場合、html要素の開始タグは省略してもよい。

たとえば、以下の場合において"<html>"タグを除去してよいものである:

<!DOCTYPE HTML>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <p>Welcome to this example.</p>
  </body>
</html>

そのようにすることは次のような文書をもたらす:

<!DOCTYPE HTML>

  <head>
    <title>Hello</title>
  </head>
  <body>
    <p>Welcome to this example.</p>
  </body>
</html>

これは厳密に同じDOMを持つ。具体的に、文書要素の周りの空白はパーサーによって拒否されることに注意する。次の例はまた、厳密に同じDOMを持つ:

<!DOCTYPE HTML><head>
    <title>Hello</title>
  </head>
  <body>
    <p>Welcome to this example.</p>
  </body>
</html>

しかし、次の例において、 開始タグを除去することは、コメントをhtml要素の前に移動する:

<!DOCTYPE HTML>
<html>
  <!-- where is this comment in the DOM? -->
  <head>
    <title>Hello</title>
  </head>
  <body>
    <p>Welcome to this example.</p>
  </body>
</html>

タグを除去するとともに、文書は実際に次と同じものを返す:

<!DOCTYPE HTML>
<!-- where is this comment in the DOM? -->
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <p>Welcome to this example.</p>
  </body>
</html>

これは、コメントに続かない場合、タグが除去されてもよい理由である: そこにコメントが存在する場合、タグを除去することは、文書のパースツリーを変更する。もちろん、コメントの位置が重要でない場合、あたかもコメントが最初の位置で開始タグを移動しているかのように、タグは省略することができる。

html要素の直後がコメントでない場合、html要素の終了タグは省略してもよい。

要素が空である場合、またはhead要素内の最初の文が要素である場合、head要素の開始タグは省略してもよい。

head要素の直後がASCII空白文字またはコメントでない場合、head要素の終了タグは省略してもよい。

body要素の開始タグは、要素が空である場合、またはbody要素内の最初のものがASCII空白文字またはコメントでない場合、省略してもよい。ただし、body要素内の最初のものがmetanoscriptlinkscriptstyleまたはtemplate要素である場合を除く。

body要素の直後がコメントでない場合、body要素の終了タグは省略してもよい。

上記の例において、空白に囲まれているため、head要素開始および終了タグ、およびbody要素開始タグは省略できないことに注意する。

<!DOCTYPE HTML>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <p>Welcome to this example.</p>
  </body>
</html>

bodyおよびhtml要素終了タグは、問題なく省略できるだろう。これらの後の任意の空白はbody要素にパースされる。)

しかし、通常は、空白は発行されない。最初に空白を除去する場合、以下を処理しない:

<!DOCTYPE HTML><html><head><title>Hello</title></head><body><p>Welcome to this example.</p></body></html>

次にDOMに影響を与えることなしに多数のタグを省略することができる:

<!DOCTYPE HTML><title>Hello</title><p>Welcome to this example.</p>

このポイントは、いくつかの空白を加え戻すことができることにある:

<!DOCTYPE HTML>
<title>Hello</title>
<p>Welcome to this example.</p>

これは、パーサーの暗示する位置で示される省略されたタグとともに、次の文書と等価であるだろう。以下をもたらす空白テキストノードは、head要素の最後における改行である:

<!DOCTYPE HTML>
<html><head><title>Hello</title>
</head><body><p>Welcome to this example.</p></body></html>

li要素が別のli要素の直後に存在する場合、または親要素に追加のコンテンツが存在しない場合、li要素の終了タグは省略してもよい。

dt要素が別のdt要素またはdd要素の直後に存在する場合、dt要素の終了タグは省略してもよい。

dd要素が別のdd要素またはdt要素の直後に存在する場合、または親要素に追加のコンテンツが存在しない場合、dd要素の終了タグは省略してもよい。

p要素がaddressarticleasideblockquotedetailsdivdlfieldsetfigcaptionfigurefooterformh1h2h3h4h5h6headerhgrouphrmainmenunavolppresearch, section, table, もしくはul要素の直後に存在する場合、または親要素で追加のコンテンツが存在せずかつ親要素がa, audio, del, ins, map, noscriptもしくは video 要素、または自律カスタム要素でないHTML要素である場合、p要素の終了タグは省略してもよい。

このように前の例をさらに単純化することができる:

<!DOCTYPE HTML><title>Hello</title><p>Welcome to this example.

rt要素が別のrtまたはrp要素の直後に存在する場合、または親要素に追加のコンテンツが存在しない場合、rt要素の終了タグは省略してもよい。

rp要素が別のrtまたはrp要素の直後に存在する場合、または親要素に追加のコンテンツが存在しない場合、rp要素の終了タグは省略してもよい。

optgroup要素の終了タグは、optgroup要素の直後に別のoptgroup要素が続く場合、その直後にhr要素が続く場合、または親要素にそれ以上のコンテンツがない場合、省略してもよい。

option要素の終了タグは、option要素の直後に別のoption要素が続く場合、optgroup要素が続く場合、hr要素が続く場合、または親要素にそれ以上のコンテンツがない場合、省略してもよい。

colgroup要素内の最初の文がcol要素である場合、かつ終了タグが省略されている別のcolgroup要素の直前に存在しない場合、colgroup要素の開始タグは省略してもよい。(要素が空である場合、省略できない。)

colgroup要素の直後がASCII空白文字またはコメントでない場合、colgroup要素の終了タグは省略してもよい。

caption要素の直後がASCII空白文字またはコメントでない場合、caption要素の終了タグは省略してもよい。

thead要素がtbodyまたはtfoot要素の直後に存在する場合、thead要素の終了タグは省略してもよい。

tbody要素内の最初の文がtr要素である場合、かつこの要素が終了タグが省略されているtbodythead、またはtfoot要素の直前に存在しない場合、tbody要素の開始タグは省略してもよい。(要素が空である場合、省略できない。)

tbody要素が別のtbodyまたはtfoot要素の直後に存在する場合、または親要素に追加のコンテンツが存在しない場合、tbody要素の終了タグは省略してもよい。

親要素に追加のコンテンツが存在しない場合、tfoot要素の終了タグは省略してもよい。

tr要素が別のtr要素の直後に存在する場合、または親要素に追加のコンテンツが存在しない場合、tr要素の終了タグは省略してもよい。

td要素が別のtdまたはth要素の直後に存在する場合、または親要素に追加のコンテンツが存在しない場合、td要素の終了タグは省略してもよい。

th要素が別のtdまたはth要素の直後に存在する場合、または親要素に追加のコンテンツが存在しない場合、th要素の終了タグは省略してもよい。

これらテーブル関連要素をすべて省略するための能力は、テーブルマークアップをより簡潔にする。

例を取ってみる:

<table>
 <caption>37547 TEE Electric Powered Rail Car Train Functions (Abbreviated)</caption>
 <colgroup><col><col><col></colgroup>
 <thead>
  <tr>
   <th>Function</th>
   <th>Control Unit</th>
   <th>Central Station</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>Headlights</td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td>Interior Lights</td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td>Electric locomotive operating sounds</td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td>Engineer's cab lighting</td>
   <td></td>
   <td></td>
  </tr>
  <tr>
   <td>Station Announcements - Swiss</td>
   <td></td>
   <td></td>
  </tr>
 </tbody>
</table>

一部の空白の違いを除き、次のように厳密に同じテーブルがマークアップされる:

<table>
 <caption>37547 TEE Electric Powered Rail Car Train Functions (Abbreviated)
 <colgroup><col><col><col>
 <thead>
  <tr>
   <th>Function
   <th>Control Unit
   <th>Central Station
 <tbody>
  <tr>
   <td>Headlights
   <td><td><tr>
   <td>Interior Lights
   <td><td><tr>
   <td>Electric locomotive operating sounds
   <td><td><tr>
   <td>Engineer's cab lighting
   <td>
   <td><tr>
   <td>Station Announcements - Swiss
   <td>
   <td></table>

この方法ではセルがより少ない空間を占めるため、これは1行で各列を持つことによってより簡単に作成できる:

<table>
 <caption>37547 TEE Electric Powered Rail Car Train Functions (Abbreviated)
 <colgroup><col><col><col>
 <thead>
  <tr> <th>Function                              <th>Control Unit     <th>Central Station
 <tbody>
  <tr> <td>Headlights                            <td><td><tr> <td>Interior Lights                       <td><td><tr> <td>Electric locomotive operating sounds  <td><td><tr> <td>Engineer's cab lighting               <td>                 <td><tr> <td>Station Announcements - Swiss         <td>                 <td></table>

DOMレベルで、セマンティックに中立な任意の場合で)空白の正確な位置とともに、ただこれらテーブル間の違いにすぎない。

ただし、任意の属性を持つ場合、開始タグは省略してはならない。

前の例をすべての除去された空白で返し、すべての任意のタグを除去する:

<!DOCTYPE HTML><title>Hello</title><p>Welcome to this example.

この例でbody要素がclass属性を持つ必要があり、かつhtml要素がlang属性を持つ必要がある場合、マークアップはこのようになる必要があるだろう:

<!DOCTYPE HTML><html lang="en"><title>Hello</title><body class="demo"><p>Welcome to this example.

この節は文書が適合している、具体的に、コンテンツモデルの違反がないことを仮定する。この仕様で説明されるコンテンツモデルに適合しない文書で説明される流行のタグ省略は、予期しないDOMの違いをもたらすことになるだろう(部分的には、これは、コンテンツモデルが無効にされるよう設計されている)。

13.1.2.5 コンテンツモデルの制約

歴史的な理由により、特定の要素は、その内容モデルによって与えられても、制限を超えて追加の制限がある。

table要素は、これらの要素がこの仕様で説明された内容モデルに従ってtable要素内で技術的に許可されているにもかかわらず、tr要素を含めてはならない。(tr要素がマークアップ内のtableの内側に配置される場合、実際にはその前のtbody開始タグを暗示するだろう。)

単一の改行は、pretextarea要素の開始タグの直後に置かれてもよい。これは、要素の処理には影響を与えない。要素のコンテンツ自身が改行で開始した場合、(内容に他の方法でリーディング改行は任意の改行、および無視のように扱われることになるため)他のオプションの改行が含まれなければならない

以下の2つのpreブロックは等価である:

<pre>Hello</pre>
<pre>
Hello</pre>
13.1.2.6 生テキストおよびエスケープ可能な生テキスト要素のコンテンツの制約

生テキストおよびエスケープ可能な要素でのテキストは、文字列"</"(U+003C LESS-THAN SIGN、U+002F SOLIDUS)の後に要素のタグ名に大文字・小文字不区別で一致する文字の後にU+0009 CHARACTER TABULATION(tab)、U+000A LINE FEED(LF)、U+000C FORM FEED(FF)、U+000D CARRIAGE RETURN(CR)、U+0020 SPACE、U+003E GREATER-THAN SIGN(>)、またはU+002F SOLIDUS(/)のいずれか1つの出現を含んではならない。

13.1.3 テキスト

テキストは要素、属性値、およびコメントの内側で許可される。追加の制約は、他のセクションで説明するように、テキストが配置される場所に基づいて、テキストで何が許可され何が許可されないのか判別される。

13.1.3.1 改行

HTMLにおける改行は、U+000D CARRIAGE RETURN(CR)文字、U+000A LINE FEED(LF)文字、または順番にU+000D CARRIAGE RETURN(CR)、U+000A LINE FEED(LF)文字のペアのいずれかとして表されてもよい。

文字参照が許可される場所で、U+000A LINE FEED(LF)文字(ただしU+000D CARRIAGE RETURN(CR)文字ではない)の文字参照はまた改行を表す。

13.1.4 文字参照

他のセクションで説明するような特定の例において、テキスト文字参照と混合してもよい。これは、他の方法で合法的にテキストに含めることができない文字をエスケープするために使用できる。

文字参照は、U+0026 AMPERSAND文字(&)で始まらなければならない。これに続いて、文字参照の3つの可能な種類がある:

名前文字参照
アンパサンドは、同じ文字を使用して、名前文字参照のセクションに記載のいずれかの名前が続かなければならない。
10進数の数値文字参照
アンパサンドは、U+0023 NUMBER SIGN文字(#)文字が続き、その後に以下の定義に従って許可されるコードポイントに対応する10進数の整数を表す、1つ以上のASCII数字が続かなければならない。数字は、その後にU+003B SEMICOLON文字(;)が続かなければならない。
16進数の数値文字参照
アンパサンドは、U+0023 NUMBER SIGN文字(#)文字が続き、その後にU+0078 LATIN SMALL LETTER X文字(x)文字またはU+0058 LATIN CAPITAL LETTER X文字(X)文字のいずれかが続き、その後に下記の定義に従って許可されるコードポイントに対応する16進数の整数を表す、1つ以上のASCII16進数字が続かなければならない。数字は、その後にU+003B SEMICOLON文字(;)が続かなければならない。

上で説明したものを形成する数値文字参照は、U+000D CR、非文字、およびASCII空白文字以外の制御文字以外の任意のコードポイントを参照するために許可される。

曖昧なアンパサンドは、U+0026 AMPERSAND文字(&)に1つ以上のASCII英数字が続き、その後にU+003B SEMICOLON文字(;)が続くものである。ここで、これらの文字は名前文字参照のセクションで与えられた任意の名前に一致しない文字である。

13.1.5 CDATAセクション

CDATAセクションは、次の順に以下のコンポーネントで構成されなければならない:

  1. 文字列"<![CDATA["。
  2. テキストが文字列"]]>"を含んではならないという追加の制約ととともに、任意のテキスト
  3. 文字列"]]>"。

CDATAセクションは外来コンテンツ(MathMLまたはSVG)でのみ使用できる。この例において、CDATAセクションはMathML ms要素のコンテンツをエスケープするために使用される:

<p>You can add a string to a number, but this stringifies the number:</p>
<math>
 <ms><![CDATA[x<y]]></ms>
 <mo>+</mo>
 <mn>3</mn>
 <mo>=</mo>
 <ms><![CDATA[x<y3]]></ms>
</math>

13.1.6 コメント

コメントは、次の形式を持たなければならない:

  1. 文字列"<!--"。
  2. 文字列">"で開始してはならず、文字列"->"で開始してはならず、文字列"<!--"、"-->"、または"--!>"を含んではならず、文字列"<!-"で終了してはならないという追加の制約ととともに、任意のテキスト
  3. 文字列"-->"。

テキストは、<!--My favorite operators are > and <!-->のように、文字列"<!"を最後に付けることができる。