~HTMLの構文

注記: この節は、`~HTML~MIME型$とされた資源に対する規則のみを述べる。 ~XML資源に対する規則は、 ~XML構文~節 にて論じられる。 ◎ This section only describes the rules for resources labeled with an HTML MIME type. Rules for XML resources are discussed in the section below entitled "The XML syntax".

12.1. ~HTML文書の書き方

この節が適用されるのは[ 文書 / 著作~tool /~markup生成器 ]に限られ、特に,適合性~検査器には適用されない — 適合性~検査器は、次~節の ~HTML文書の構文解析-法 に与える要件を利用し~MUST。 ◎ This section only applies to documents, authoring tools, and markup generators. In particular, it does not apply to conformance checkers; conformance checkers must use the requirements given in the next section ("parsing HTML documents").

【 この節における “書く( write )” は、生成器から “書き出す” ことも含まれる。 】

文書は、次に与える順の~~部品から~~構成されてい~MUST: ◎ Documents must consist of the following parts, in the given order:

  1. 0 〜 1 個の `FEFF^U BYTE ORDER MARK `BOM^smb ◎ Optionally, a single U+FEFF BYTE ORDER MARK (BOM) character.
  2. 0 個以上の[ `~comment$ / `~ASCII空白$ ] ◎ Any number of comments and ASCII whitespace.
  3. `~DOCTYPE$ ◎ A DOCTYPE.
  4. 0 個以上の[ `~comment$ / `~ASCII空白$ ] ◎ Any number of comments and ASCII whitespace.
  5. `html$e `要素$の形をとる`文書~要素$ ◎ The document element, in the form of an html element.
  6. 0 個以上の[ `~comment$ / `~ASCII空白$ ] ◎ Any number of comments and ASCII whitespace.

上に言及した各種~内容については、以下の少数の節にて述べる。 ◎ The various types of content mentioned above are described in the next few sections.

加えて、`文字~符号化方式~宣言$を直列化する方法にも ある制約があり、その論題をとりあげる節にて論じられる。 ◎ In addition, there are some restrictions on how character encoding declarations are to be serialized, as discussed in the section on that topic.

注記: [ `html$e 要素の前 / `html$e 要素の内側の始端 / `head$e 要素の前 ]にある`~ASCII空白$は、文書の構文解析-時には落とされることになる。 一方で, `html$e 要素のにある`~ASCII空白$は、 `body$e 要素の終端にあったかのように構文解析される。 したがって,`文書~要素$の前後にある`~ASCII空白$は、往来しない `構文解析-, 直列化-を経た結果は元と異なり得る^tnote 。 ◎ ASCII whitespace before the html element, at the start of the html element and before the head element, will be dropped when the document is parsed; ASCII whitespace after the html element will be parsed as if it were at the end of the body element. Thus, ASCII whitespace around the document element does not round-trip.

次に該当するものに対しては,その後に改行文字を挿入することが示唆される:

  • ~DOCTYPEの後
  • 文書~要素の前にある~comment
  • `html$e 要素の開始tag
  • `html$e 要素の内側にあって, `head$e 要素の前にある~comment

【 ~HTMLにおける文書~要素は `html$e 要素に他ならない(なぜ,このように使い分けられている?)。 】

◎ It is suggested that newlines be inserted after the DOCTYPE, after any comments that are before the document element, after the html element's start tag (if it is not omitted), and after any comments that are inside the html element but before the head element.

~HTML構文における多くの文字列(例:要素の名前やその属性)は、`~ASCII英大文字$と`~ASCII英小文字$に限り,文字大小は区別されない。 この節では、これを簡便に “文字大小無視( case-insensitive )” と称する。 ◎ Many strings in the HTML syntax (e.g. the names of elements and their attributes) are case-insensitive, but only for ASCII upper alphas and ASCII lower alphas. For convenience, in this section this is just referred to as "case-insensitive".

【 と,原文には記されているが、この訳では一律に “~ASCII大小無視” と記すことにする(さして簡便にならないので)。 】

12.1.1. ~DOCTYPE

`~DOCTYPE@ は、要求される “前置き” である。 ◎ A DOCTYPE is a required preamble.

注記: ~DOCTYPEは、旧来の理由から要求される。 省略された場合、~browserは,[ 何らかの仕様と非互換な,異なる具現化~mode ]を利用する傾向にある。 文書~内に~DOCTYPEを含めておけば、[ ~browserは,最善の労をもって関連する仕様に従う ]ことが確保される。 ◎ DOCTYPEs are required for legacy reasons. When omitted, browsers tend to use a different rendering mode that is incompatible with some specifications. Including the DOCTYPE in a document ensures that the browser makes a best-effort attempt at following the relevant specifications.

~DOCTYPEは、次に与える順の文字~並びで~MUST: ◎ A DOCTYPE must consist of the following components, in this order:

  1. `~ASCII大小無視$で `<!DOCTYPE^l に合致する文字列 ◎ A string that is an ASCII case-insensitive match for the string "<!DOCTYPE".
  2. 1 個以上の`~ASCII空白$ ◎ One or more ASCII whitespace.
  3. `~ASCII大小無視$で `html^l に合致する文字列 ◎ A string that is an ASCII case-insensitive match for the string "html".
  4. 0 個( “短い~DOCTYPE” )または 1 個の`~DOCTYPE旧来~文字列$ ◎ Optionally, a DOCTYPE legacy string.
  5. 0 個以上の`~ASCII空白$ ◎ Zero or more ASCII whitespace.
  6. `003E^U `>^smb ◎ A U+003E GREATER-THAN SIGN character (>).

注記: 言い換えれば、~ASCII大小無視で `<!DOCTYPE html>^l に合致する文字列。 ◎ In other words, <!DOCTYPE html>, case-insensitively.


上の “短い~DOCTYPE” による~HTML~markupを出力できない~HTML生成器の目的においては、~DOCTYPEの中に `~DOCTYPE旧来~文字列@ ( DOCTYPE legacy string )が挿入されても~MAY(上で定義した位置に)。 この文字列は、次に与える順の文字~並びで~MUST: ◎ For the purposes of HTML generators that cannot output HTML markup with the short DOCTYPE "<!DOCTYPE html>", a DOCTYPE legacy string may be inserted into the DOCTYPE (in the position defined above). This string must consist of:

  1. 1 個以上の`~ASCII空白$ ◎ One or more ASCII whitespace.
  2. `~ASCII大小無視$で `SYSTEM^l に合致する文字列 ◎ A string that is an ASCII case-insensitive match for the string "SYSTEM".
  3. 1 個以上の`~ASCII空白$ ◎ One or more ASCII whitespace.
  4. [ ❝" / ❝' ]( `引用符^i ) ◎ A U+0022 QUOTATION MARK or U+0027 APOSTROPHE character (the quote mark).
  5. ~literal文字列 "`~about_legacy-compat$" ◎ The literal string "about:legacy-compat".
  6. 2 つ前に挙げた `引用符^i と同じ文字 ◎ A matching U+0022 QUOTATION MARK or U+0027 APOSTROPHE character (i.e. the same character as in the earlier step labeled quote mark).

注記: 言い換えれば、[ `<!DOCTYPE html SYSTEM "about:legacy-compat">^c / `<!DOCTYPE html SYSTEM 'about:legacy-compat'>^c ]に,引用符で括られた部分は~ASCII大小無視で合致し, 他の部分は同じになる。 ◎ In other words, <!DOCTYPE html SYSTEM "about:legacy-compat"> or <!DOCTYPE html SYSTEM 'about:legacy-compat'>, case-insensitively except for the part in single or double quotes.

`~DOCTYPE旧来~文字列$は、 “短い~DOCTYPE” を出力できない~systemで生成される文書を除き,利用されるべきでない。 ◎ The DOCTYPE legacy string should not be used unless the document is generated from a system that cannot output the shorter string.

12.1.2. 要素

`要素@ ( element )は、次の 5 種に分けられる: ◎ There are five different kinds of elements: void elements, raw text elements, escapable raw text elements, foreign elements, and normal elements.

`空要素@ ( void element )
`area$e, `base$e, `br$e, `col$e, `embed$e, `hr$e, `img$e, `input$e, `link$e, `meta$e, `param$e, `source$e, `track$e, `wbr$e
`生~text要素@ ( raw text element )
`script$e, `style$e
`~escape可能な生~text要素@ (escapable raw text element )
`textarea$e, `title$e
`外来の要素@ (foreign element )
[ `~MathML名前空間$ / `~SVG名前空間$ ]に属する要素 ◎ Elements from the MathML namespace and the SVG namespace.
`通常の要素@ ( normal element )
許容される他のすべての`~HTML要素$。 ◎ All other allowed HTML elements are normal elements.

`~tag@ ( tag )は、~markupにおいて要素の始端と終端を区切るために利用される。 [ `生~text要素$ / `~escape可能な生~text要素$ / `通常の要素$ ]には、その 始端を指示する`開始tag$, 終端を指示する`終了tag$ がある。 ある種の`通常の要素$の[ 開始tag/終了tag ]は、下の省略可能な~tag節に述べるように,`省略-$できる。 省略できないものは、省略されては~MUST_NOT。 `空要素$には、開始tagのみがあり,終了tagは指定されては~MUST_NOT。 `外来の要素$には、開始tagを有していて,かつ その開始tagが[ `自己閉じ$でないならば 終了tagも有してい~MUST / `自己閉じ$であるならば 終了tagを有しては~MUST_NOT ]。 ◎ Tags are used to delimit the start and end of elements in the markup. Raw text, escapable raw text, and normal elements have a start tag to indicate where they begin, and an end tag to indicate where they end. The start and end tags of certain normal elements can be omitted, as described below in the section on optional tags. Those that cannot be omitted must not be omitted. Void elements only have a start tag; end tags must not be specified for void elements. Foreign elements must either have a start tag and an end tag, or a start tag that is marked as self-closing, in which case they must not have an end tag.

要素の`内容$は、開始tagの直後から終了tagの直前までの合間に置かれ~MUST(いずれの~tagも,ある種の事例では黙示され得る)。 個々の要素に許容される正確な内容は、この仕様の他所に述べたように,要素の`内容~model$に依存する。 要素は、その内容~modelが不許可にする内容を包含しては~MUST_NOT。 加えて、上の 5 種の要素には追加の構文上の要件もある。 ◎ The contents of the element must be placed between just after the start tag (which might be implied, in certain cases) and just before the end tag (which again, might be implied in certain cases). The exact allowed contents of each individual element depend on the content model of that element, as described earlier in this specification. Elements must not contain content that their content model disallows. In addition to the restrictions placed on the contents by those content models, however, the five types of elements have additional syntactic requirements.

`空要素$は、内容を有し得ない(終了tagはないので、開始tagと終了tagの合間に置ける内容はない)。 ◎ Void elements can't have any contents (since there's no end tag, no content can be put between the start tag and the end tag).

`生~text要素$は、`~text$を内容に有し得る。 また、下に述べる制約もある。 ◎ Raw text elements can have text, though it has restrictions described below.

`~escape可能な生~text要素$は、[ `~text$, `文字~参照$ ]を内容に有し得る — ただし、~textは`多義的amp$を包含しては~MUST_NOT。 また、下に述べる制約もある。 ◎ Escapable raw text elements can have text and character references, but the text must not contain an ambiguous ampersand. There are also further restrictions described below.

`外来の要素$のうち,開始tagが`自己閉じ$とされたものは、内容を有し得ない(これも,終了tagはないので、開始tagと終了tagの合間に置ける内容はない)。 他の`外来の要素$は、[ `~text$, `文字~参照$, `~CDATAsec$, 他の`要素$, `~comment$ ]を内容に有し得る — ただし、~textは[ 文字`003C^U `<^smb / `多義的amp$ ]を包含しては~MUST_NOT。 ◎ Foreign elements whose start tag is marked as self-closing can't have any contents (since, again, as there's no end tag, no content can be put between the start tag and the end tag). Foreign elements whose start tag is not marked as self-closing can have text, character references, CDATA sections, other elements, and comments, but the text must not contain the character U+003C LESS-THAN SIGN (<) or an ambiguous ampersand.

注記: ~HTML構文は、`外来の要素$においても,名前空間~宣言を~supportしない。 ◎ The HTML syntax does not support namespace declarations, even in foreign elements.

具体例として、次の~HTML素片を考える: ◎ For instance, consider the following HTML fragment:

`element-1^xCode

最も内縁の要素 `cdr:license^e は、実際には ~SVG名前空間に属する — ~XMLと違って, `xmlns:cdr^l 属性の効果はないので。 上の素片~内の~commentが言ってるように、この素片は,実際には適合していない。 ~SVG仕様は、~SVG名前空間~内に `cdr:license^l と称される要素は定義しないので。 ◎ The innermost element, cdr:license, is actually in the SVG namespace, as the "xmlns:cdr" attribute has no effect (unlike in XML). In fact, as the comment in the fragment above says, the fragment is actually non-conforming. This is because the SVG specification does not define any elements called "cdr:license" in the SVG namespace.

`通常の要素$は、[ `~text$, `文字~参照$, 他の`要素$, `~comment$ ]を内容に有し得る — ただし、~textは[ 文字`003C^U `<^smb / `多義的amp$ ]を包含しては~MUST_NOT。 一部の`通常の要素$には、許容される内容について,[ 内容~modelにより課される制約 / この段落に述べた制約 ]を超えるような制約が,他にもある。 ◎ Normal elements can have text, character references, other elements, and comments, but the text must not contain the character U+003C LESS-THAN SIGN (<) or an ambiguous ampersand. Some normal elements also have yet more restrictions on what content they are allowed to hold, beyond the restrictions imposed by the content model and those described in this paragraph. Those restrictions are described below.

各~tagは、要素の名前を与える `~tag名@ ( tag name )を包含する。 どの~HTML要素も、その名前は`~ASCII英数字$のみからなる。 ~HTML構文においては、~tag名は,`外来の要素$に対しても`~ASCII大小無視$である — すなわち、すべてを小文字~化した結果が要素の~tag名に合致する限り,小文字, 大文字を混ぜて書いても~MAY。 ◎ Tags contain a tag name, giving the element's name. HTML elements all have names that only use ASCII alphanumerics. In the HTML syntax, tag names, even those for foreign elements, may be written with any mix of lower- and uppercase letters that, when converted to all-lowercase, matches the element's tag name; tag names are case-insensitive.

12.1.2.1. 開始tag

`開始tag@ ( start tag )は、次に与える順の文字~並びで~MUST: ◎ Start tags must have the following format:

  1. `003C^U `<^smb ◎ The first character of a start tag must be a U+003C LESS-THAN SIGN character (<).
  2. 要素の`~tag名$を与える文字~並び ◎ The next few characters of a start tag must be the element's tag name.
  3. (属性たちを与える,) 0 個以上の[ 次に与える順の文字~並び ]:

    1. 1 個以上の`~ASCII空白$
    2. 1 個の属性 — そのための構文は下に述べる
    ◎ If there are to be any attributes in the next step, there must first be one or more ASCII whitespace. ◎ Then, the start tag may have a number of attributes, the syntax for which is described below. Attributes must be separated from each other by one or more ASCII whitespace.
  4. 0 個以上の`~ASCII空白$ — ただし,場合によっては、最後の属性に 1 個以上の~ASCII空白を後続させることが要求される。 下の`属性$節を見よ。 ◎ After the attributes, or after the tag name if there are no attributes, there may be one or more ASCII whitespace. (Some attributes are required to be followed by a space. See the attributes section below.)
  5. [ `空要素$/`外来の要素$ ]である場合に限り, 0 〜 1 個の ❝/ — この文字を与えた場合 ⇒ `空要素$には効果はないが、`外来の要素$に対しては,開始tagを `自己閉じ@ ( self-closing )にする。 ◎ Then, if the element is one of the void elements, or if the element is a foreign element, then there may be a single U+002F SOLIDUS character (/). This character has no effect on void elements, but on foreign elements it marks the start tag as self-closing.
  6. `003E^U `>^smb ◎ Finally, start tags must be closed by a U+003E GREATER-THAN SIGN character (>).

12.1.2.2. 終了tag

`終了tag@ ( end tag )は、次に与える順の文字~並びで~MUST: ◎ End tags must have the following format:

  1. `003C^U `<^smb ◎ The first character of an end tag must be a U+003C LESS-THAN SIGN character (<).
  2. ❝/ ◎ The second character of an end tag must be a U+002F SOLIDUS character (/).
  3. 要素の`~tag名$を与える文字~並び ◎ The next few characters of an end tag must be the element's tag name.
  4. 0 個以上の`~ASCII空白$ ◎ After the tag name, there may be one or more ASCII whitespace.
  5. `003E^U `>^smb ◎ Finally, end tags must be closed by a U+003E GREATER-THAN SIGN character (>).

12.1.2.3. 属性

要素の `属性@ ( attribute )は、要素の開始tagの内側にて表される。 各 属性は、名前と値を持つ: ◎ Attributes for an element are expressed inside the element's start tag.

`属性~名@ ( attribute name )
次に挙げるものを除く 1 個以上の文字からなってい~MUST ⇒ `制御文字$ / `0020^U SPACE / ❝" / ❝' / `003E^U `>^smb / ❝/ / ❝= / `非文字$ ◎ Attributes have a name and a value. Attribute names must consist of one or more characters other than controls, U+0020 SPACE, U+0022 ("), U+0027 ('), U+003E (>), U+002F (/), U+003D (=), and noncharacters. In the HTML syntax, attribute names, even those for foreign elements, may be written with any mix of ASCII lower and ASCII upper alphas.
~HTML構文においては、属性~名は,`外来の要素$であっても, `~ASCII英小文字$/`~ASCII英大文字$を混ぜて書いても~MAY。 ◎ ↑
`属性~値@ ( attribute value )
`~text$と`文字~参照$の混在 — ただし、~textは`多義的amp$を包含できない。 ◎ Attribute values are a mixture of text and character references, except with the additional restriction that the text cannot contain an ambiguous ampersand.

属性は、次の 4 通りの仕方で指定できる: ◎ Attributes can be specified in four different ways:

空~属性~構文 ◎ Empty attribute syntax
`属性~名$のみ。 値は、暗黙的に空~文字列になる。 ◎ Just the attribute name. The value is implicitly the empty string.

次の例の `disabled$a 属性は、空~属性~構文で与えられている: ◎ In the following example, the disabled attribute is given with the empty attribute syntax:

`attribute-1^xCode
◎ ↓If an attribute using the empty attribute syntax is to be followed by another attribute, then there must be ASCII whitespace separating the two.
引用符無しの属性~値~構文 ◎ Unquoted attribute value syntax

次に与える順の文字~並び:

  1. `属性~名$
  2. 0 個以上の`~ASCII空白$
  3. ❝=
  4. 0 個以上の`~ASCII空白$
  5. `属性~値$であって,空でない~AND 次に挙げる文字は包含しないもの ⇒ `~ASCII空白$ / ❝" / ❝' / ❝= / `003C^U `<^smb / `003E^U `>^smb / ❝`
◎ The attribute name, followed by zero or more ASCII whitespace, followed by a single U+003D EQUALS SIGN character, followed by zero or more ASCII whitespace, followed by the attribute value, which, in addition to the requirements given above for attribute values, must not contain any literal ASCII whitespace, any U+0022 QUOTATION MARK characters ("), U+0027 APOSTROPHE characters ('), U+003D EQUALS SIGN characters (=), U+003C LESS-THAN SIGN characters (<), U+003E GREATER-THAN SIGN characters (>), or U+0060 GRAVE ACCENT characters (`), and must not be the empty string.

次の例の `value$a 属性は、引用符無しの属性~値~構文で与えられている: ◎ In the following example, the value attribute is given with the unquoted attribute value syntax:

`attribute-2^xCode
この属性~構文を利用している属性に,[ `開始tag$構文の[ `空要素$/`自己閉じ$ ]に許容される省略可能な ❝/ ]が後続する場合、その 2 つは`~ASCII空白$で分離され~MUST。 ◎ If an attribute using the unquoted attribute syntax is to be followed by another attribute or by the optional U+002F SOLIDUS character (/) allowed in step 6 of the start tag syntax above, then there must be ASCII whitespace separating the two. ↓
一重引用符付き属性~値~構文 ◎ Single-quoted attribute value syntax

次に与える順の文字~並び:

  1. `属性~名$
  2. 0 個以上の`~ASCII空白$
  3. ❝=
  4. 0 個以上の`~ASCII空白$
  5. ❝'
  6. `属性~値$の要件を満たす文字列であって,~literal ❝' を包含しないもの
  7. ❝'
◎ The attribute name, followed by zero or more ASCII whitespace, followed by a single U+003D EQUALS SIGN character, followed by zero or more ASCII whitespace, followed by a single U+0027 APOSTROPHE character ('), followed by the attribute value, which, in addition to the requirements given above for attribute values, must not contain any literal U+0027 APOSTROPHE characters ('), and finally followed by a second single U+0027 APOSTROPHE character (').

次の例の `type$a 属性は、一重引用符付き属性~値~構文で与えられている: ◎ In the following example, the type attribute is given with the single-quoted attribute value syntax:

`attribute-3^xCode
◎ ↓If an attribute using the single-quoted attribute syntax is to be followed by another attribute, then there must be ASCII whitespace separating the two.
二重引用符付き属性~値~構文 ◎ Double-quoted attribute value syntax

次に与える順の文字~並び:

  1. `属性~名$
  2. 0 個以上の`~ASCII空白$
  3. ❝=
  4. 0 個以上の`~ASCII空白$
  5. ❝"
  6. `属性~値$の要件を満たす文字列であって,~literal ❝" を包含しないもの
  7. ❝"
◎ The attribute name, followed by zero or more ASCII whitespace, followed by a single U+003D EQUALS SIGN character, followed by zero or more ASCII whitespace, followed by a single U+0022 QUOTATION MARK character ("), followed by the attribute value, which, in addition to the requirements given above for attribute values, must not contain any literal U+0022 QUOTATION MARK characters ("), and finally followed by a second single U+0022 QUOTATION MARK character (").

次の例の `name$a 属性は、二重引用符付き属性~値~構文で与えられている: ◎ In the following example, the name attribute is given with the double-quoted attribute value syntax:

`attribute-4^xCode
◎ ↓If an attribute using the double-quoted attribute syntax is to be followed by another attribute, then there must be ASCII whitespace separating the two.

同じ開始tag内にある複数の属性は:

  • 利用する属性~構文が何であれ、`~ASCII空白$で互いに分離され~MUST。
  • 互いの名前は`~ASCII大小無視$で合致しては~MUST_NOT。
◎ ↑ ◎ There must never be two or more attributes on the same start tag whose names are an ASCII case-insensitive match for each other.

`外来の要素$が有する名前空間付き属性のうち,次の表の いずれかの行の ( 1 列目, 2 列目 ) に与える ( 局所~名, 名前空間 ) を持つものは、同じ行の 3 列目に与える名前として書かれ~MUST。 ◎ When a foreign element has one of the namespaced attributes given by the local name and namespace of the first and second cells of a row from the following table, it must be written using the name given by the third cell from the same row.

局所~名 名前空間 属性~名
`actuate^a `~XLink名前空間$ `xlink:actuate^a
`arcrole^a `~XLink名前空間$ `xlink:arcrole^a
`href^a `~XLink名前空間$ `xlink:href^a
`role^a `~XLink名前空間$ `xlink:role^a
`show^a `~XLink名前空間$ `xlink:show^a
`title^a `~XLink名前空間$ `xlink:title^a
`type^a `~XLink名前空間$ `xlink:type^a
`lang^a `~XML名前空間$ `xml:lang^a
`space^a `~XML名前空間$ `xml:space^a
`xmlns^a `~XMLNS名前空間$ `xmlns^a
`xlink^a `~XMLNS名前空間$ `xmlns:xlink^a

`~HTML構文$においては、他の名前空間付き属性は表せない。 ◎ No other namespaced attribute can be expressed in the HTML syntax.

注記: 上の表~内の属性が適合するかどうかは、他の仕様(例: ~SVG /~MathML仕様)にて定義される。 この節は、これらの属性が~HTML構文を用いて直列化された場合の構文~規則のみを述べる。 ◎ Whether the attributes in the table above are conforming or not is defined by other specifications (e.g. the SVG and MathML specifications); this section only describes the syntax rules if the attributes are serialized using the HTML syntax.

12.1.2.4. 省略可能な~tag

ある種の~tagは `省略-@ ( omit )できる。 ◎ Certain tags can be omitted.

注記: 下に述べる状況において,要素の`開始tag$を省略しても、要素が無いことを意味するものではない。 それは黙示されるが,依然としてそこにある。 例えば,~HTML文書には、根 `html$e 要素は常にある — 文字列 `<html>^c が~markup内のどこにも現れなくても。 ◎ Omitting an element's start tag in the situations described below does not mean the element is not present; it is implied, but it is still there. For example, an HTML document always has a root html element, even if the string <html> doesn't appear anywhere in the markup.

所与の要素の `直後の同胞@ は、要素の親~内で要素の直後に現れる内容を指すとする — 要素~自身が親~内の最後の内容ならば無い。

`html$e 要素の`開始tag$は、要素が次を満たすならば省略されて~MAY ⇒ 内側にある最初のものは`~comment$でない ◎ An html element's start tag may be omitted if the first thing inside the html element is not a comment.

例えば次の事例では、 `<html>^l ~tagを除去してもかまわない: ◎ For example, in the following case it's ok to remove the "<html>" tag:

`optional-html-1^xCode

そうした結果の文書は、次の様になる: ◎ Doing so would make the document look like this:

`optional-html-2^xCode

これは、前と正確に同じ~DOMになる。 特に、構文解析器は,`文書~要素$の前後にある空白を無視することに注意。 次の例でも,正確に同じ~DOMが得られることになる: ◎ This has the exact same DOM. In particular, note that whitespace around the document element is ignored by the parser. The following example would also have the exact same DOM:

`optional-html-3^xCode

しかしながら,次の例では、開始tagを除去すると,~commentは `html$e 要素の前に移動する: ◎ However, in the following example, removing the start tag moves the comment to before the html element:

`optional-html-4^xCode

~tagが除去されたなら、文書は実際には次と同じに転化される: ◎ With the tag removed, the document actually turns into the same as this:

`optional-html-5^xCode

これが、~commentが後続しない場合に限り,~tagを除去できるわけである: ~commentがある場合、~tagを除去すると,文書を構文解析した結果の木は変化する。 もちろん,~commentの位置が~~問題にならないなら、~tagは省略できる — ~commentは、先ず開始tagの前に移動されたかのようになる。 ◎ This is why the tag can only be removed if it is not followed by a comment: removing the tag when there is a comment there changes the document's resulting parse tree. Of course, if the position of the comment does not matter, then the tag can be omitted, as if the comment had been moved to before the start tag in the first place.

`html$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または`~comment$でない ◎ An html element's end tag may be omitted if the html element is not immediately followed by a comment.

`head$e 要素の`開始tag$は、要素が次を満たすならば省略されて~MAY ⇒ 内側にある最初のものは、無い(要素は空), または要素である。 ◎ A head element's start tag may be omitted if the element is empty, or if the first thing inside the head element is an element.

`head$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `~ASCII空白$/`~comment$ ]でない ◎ A head element's end tag may be omitted if the head element is not immediately followed by ASCII whitespace or a comment.

`body$e 要素の`開始tag$は、要素が次を満たすならば省略されて~MAY ⇒ 内側にある最初のものは、無い(要素は空), または次のいずれでもない ⇒ `~ASCII空白$/`~comment$/[ `meta$e / `link$e / `script$e / `style$e / `template$e ]要素 ◎ A body element's start tag may be omitted if the element is empty, or if the first thing inside the body element is not ASCII whitespace or a comment, except if the first thing inside the body element is a meta, link, script, style, or template element.

`body$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または`~comment$でない。 ◎ A body element's end tag may be omitted if the body element is not immediately followed by a comment.

上の例において、[ `head$e 要素の開始tagと終了tag / `body$e 要素の開始tag ]は省略できないことに注意 — それらの前/後には空白があるので: ◎ Note that in the example above, the head element start and end tags, and the body element start tag, can't be omitted, because they are surrounded by whitespace:

`optional-body-1^xCode

( `body$e / `html$e 要素の終了tagは、~~問題無く省略できる — それらの後に空白があろうが, `body$e 要素の中にあるものとして構文解析されるので。) ◎ (The body and html element end tags could be omitted without trouble; any spaces after those get parsed into the body element anyway.)

しかしながら,通例的には、空白は~~問題にならない。 あらかじめ空白を除去してもかまわない: ◎ Usually, however, whitespace isn't an issue. If we first remove the whitespace we don't care about:

`optional-body-2^xCode

~DOMに影響することなく,いくつかの~tagを省略できる: ◎ Then we can omit a number of tags without affecting the DOM:

`optional-body-3^xCode

さらに、空白を追加し直すこともできる: ◎ At that point, we can also add some whitespace back:

`optional-body-4^xCode

これは、次の文書に等価になる — 省略された~tagは、構文解析器により黙示される位置に示されている。 結果の空白~text~nodeは、 `head$e 要素の内側の終端にある改行文字のみになる: ◎ This would be equivalent to this document, with the omitted tags shown in their parser-implied positions; the only whitespace text node that results from this is the newline at the end of the head element:

`optional-body-5^xCode

`li$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または `li$e 要素である ◎ An li element's end tag may be omitted if the li element is immediately followed by another li element or if there is no more content in the parent element.

`dt$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `dt$e / `dd$e ]要素である ◎ A dt element's end tag may be omitted if the dt element is immediately followed by another dt element or a dd element.

`dd$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `dd$e / `dt$e ]要素である ◎ A dd element's end tag may be omitted if the dd element is immediately followed by another dd element or a dt element, or if there is no more content in the parent element.

`p$e 要素の`終了tag$は、次のいずれかが満たされるならば省略されて~MAY:

  • `直後の同胞$は、次のいずれかの要素である ⇒ `address$e / `article$e / `aside$e / `blockquote$e / `details$e / `div$e / `dl$e / `fieldset$e / `figcaption$e / `figure$e / `footer$e / `form$e / `h6$e / `h6$e / `h6$e / `h6$e / `h6$e / `h6$e / `header$e / `hgroup$e / `hr$e / `main$e / `menu$e / `nav$e / `ol$e / `p$e / `pre$e / `section$e / `table$e / `ul$e
  • `直後の同胞$は無い ~AND 要素の親は[ `自律的~custom要素$ / 次に挙げるもの以外の`~HTML要素$ ]である ⇒ `a$e / `audio$e / `del$e / `ins$e / `map$e / `noscript$e / `video$e
◎ A p element's end tag may be omitted if the p element is immediately followed by an address, article, aside, blockquote, details, div, dl, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, main, menu, nav, ol, p, pre, section, table, or ul element, or if there is no more content in the parent element and the parent element is an HTML element that is not an a, audio, del, ins, map, noscript, or video element, or an autonomous custom element.

したがって,先に掲げた例は、次の様に更に単純化できる: ◎ We can thus simplify the earlier example further:

`optional-p-1^xCode

`rt$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `rt$e / `rp$e ]要素である ◎ An rt element's end tag may be omitted if the rt element is immediately followed by an rt or rp element, or if there is no more content in the parent element.

`rp$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `rt$e / `rp$e ]要素である ◎ An rp element's end tag may be omitted if the rp element is immediately followed by an rt or rp element, or if there is no more content in the parent element.

`optgroup$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `optgroup$e 要素 ]である ◎ An optgroup element's end tag may be omitted if the optgroup element is immediately followed by another optgroup element, or if there is no more content in the parent element.

`option$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `option$e / `optgroup$e ]要素である ◎ An option element's end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element.

`colgroup$e 要素の`開始tag$は、要素が次を満たすならば省略されて~MAY ⇒ 内側にある最初のものは `col$e 要素である ~AND 直前に[ `終了tag$が省略された 別の `colgroup$e 要素 ]はない。 (要素は空である場合、省略できない。) ◎ A colgroup element's start tag may be omitted if the first thing inside the colgroup element is a col element, and if the element is not immediately preceded by another colgroup element whose end tag has been omitted. (It can't be omitted if the element is empty.)

`colgroup$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `~ASCII空白$/`~comment$ ]でない ◎ A colgroup element's end tag may be omitted if the colgroup element is not immediately followed by ASCII whitespace or a comment.

`caption$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `~ASCII空白$/`~comment$ ]でない ◎ A caption element's end tag may be omitted if the caption element is not immediately followed by ASCII whitespace or a comment.

`thead$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、[ `tbody$e / `tfoot$e ]要素である ◎ A thead element's end tag may be omitted if the thead element is immediately followed by a tbody or tfoot element.

`tbody$e 要素の`開始tag$は、要素が次を満たすならば省略されて~MAY ⇒ 内側にある最初のものは `tr$e 要素である ~AND 直前に[ `終了tag$が省略された[ `tbody$e / `thead$e / `tfoot$e ]要素 ]はない (要素は空である場合、省略できない。) ◎ A tbody element's start tag may be omitted if the first thing inside the tbody element is a tr element, and if the element is not immediately preceded by a tbody, thead, or tfoot element whose end tag has been omitted. (It can't be omitted if the element is empty.)

`tbody$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `tbody$e / `tfoot$e ]要素である ◎ A tbody element's end tag may be omitted if the tbody element is immediately followed by a tbody or tfoot element, or if there is no more content in the parent element.

`tfoot$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い ◎ A tfoot element's end tag may be omitted if there is no more content in the parent element.

`tr$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `tr$e 要素 ]である ◎ A tr element's end tag may be omitted if the tr element is immediately followed by another tr element, or if there is no more content in the parent element.

`td$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `td$e / `th$e ]要素である ◎ A td element's end tag may be omitted if the td element is immediately followed by a td or th element, or if there is no more content in the parent element.

`th$e 要素の`終了tag$は、要素が次を満たすならば省略されて~MAY ⇒ `直後の同胞$は、無い, または[ `td$e / `th$e ]要素である ◎ A th element's end tag may be omitted if the th element is immediately followed by a td or th element, or if there is no more content in the parent element.

これらの,~tableに関係する~tagを省略する能を用いれば、~table~markupはかなり簡素になる。 例えば次の~markupに対しては: ◎ The ability to omit all these table-related tags makes table markup much terser. ◎ Take this example:

`optional-table-1^xCode

次の様に~mark-upしても、空白の有無の相違を除き,正確に同じ~tableになる: ◎ The exact same table, modulo some whitespace differences, could be marked up as follows:

`optional-table-2^xCode

この仕方により、~cellが占める場所はかなり減るので、各~rowを一行にまとめて,さらに簡素にできる: ◎ Since the cells take up much less room this way, this can be made even terser by having each row on one line:

`optional-table-3^xCode

これらの~tableの間の,~DOM~levelにおける唯一の相違は、(いずれの事例でも意味論的に無色な)空白の精確な位置になる。 ◎ The only differences between these tables, at the DOM level, is with the precise position of the (in any case semantically-neutral) whitespace.

しかしながら、属性を有する`開始tag$は,決して省略して書き出されては~MUST_NOT。 ◎ However, a start tag must never be omitted if it has any attributes.

先に掲げた、すべての空白, すべての省略可能な~tagが除去された例に戻って: ◎ Returning to the earlier example with all the whitespace removed and then all the optional tags removed:

`optional-attr-1^xCode

この例にて, `body$e 要素は `class$a 属性を有していて, `html$e 要素は `lang$a 属性を有していた場合、~markupは次のようになる: ◎ If the body element in this example had to have a class attribute and the html element had to have a lang attribute, the markup would have to become:

`optional-attr-2^xCode

注記: この節は、当の文書は適合している — 特に,`内容~model$に対する違反はない — ものと見做している。 文書がこの仕様に述べた`内容~model$に適合しない場合、文書~内の~tagを この節にて述べた流儀で省略した結果は,予期されない~DOMの相違をもたらす可能性が高い(内容~modelは、ある程度,これを避けるよう設計されている)。 ◎ This section assumes that the document is conforming, in particular, that there are no content model violations. Omitting tags in the fashion described in this section in a document that does not conform to the content models described in this specification is likely to result in unexpected DOM differences (this is, in part, what the content models are designed to avoid).

12.1.2.5. 内容~modelに課される制約

歴史的~理由から、ある種の要素には,その内容~modelに与えた制約を超えるような更なる制約がある。 ◎ For historical reasons, certain elements have extra restrictions beyond even the restrictions given by their content model.

`table$e 要素は `tr$e 要素を直に包含しては~MUST_NOT — `tr$e 要素は、技術的には,この仕様に述べた内容~modelに則って `table$e 要素の内側に許容されているが。 (~markup内で `tr$e 要素が `table$e の内側に直に置かれた場合、その前に `tbody$e 開始tagを黙示することになる。) ◎ A table element must not contain tr elements, even though these elements are technically allowed inside table elements according to the content models described in this specification. (If a tr element is put inside a table in the markup, it will in fact imply a tbody start tag before it.)

[ `pre$e / `textarea$e ]要素の`開始tag$の直後には、 1 個の`改行文字$が置かれても~MAY。 これは、要素の処理に影響しない — すなわち,要素の内容には含まれない。 これ以外の後続の`改行文字$は、要素の内容に含められ~MUST(さもなければ, 内容~内の頭部の改行文字は、省略可能な改行文字の様に扱われ,無視されることになるので)。 ◎ A single newline may be placed immediately after the start tag of pre and textarea elements. This does not affect the processing of the element. The otherwise optional newline must be included if the element's contents themselves start with a newline (because otherwise the leading newline in the contents would be treated like the optional newline, and ignored).

次の 2 個の `pre$e ~blockは、等価になる: ◎ The following two pre blocks are equivalent:

`content-1^xCode `content-2^xCode

12.1.2.6. 生~text/~escape可能な生~text要素の内容に課される制約

`生~text要素$/`~escape可能な生~text要素$ 内の~textは、次に与える順の文字~並びを包含しては~MUST_NOT:

  1. `003C^U `<^smb
  2. ❝/
  3. 要素の~tag名に`~ASCII大小無視$で合致する文字~並び
  4. `~ASCII空白$ / `003E^U `>^smb / ❝/
◎ The text in raw text and escapable raw text elements must not contain any occurrences of the string "</" (U+003C LESS-THAN SIGN, U+002F SOLIDUS) followed by characters that case-insensitively match the tag name of the element followed by one of 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 (>), or U+002F SOLIDUS (/).

12.1.3. ~text

`~text@ ( text )は、[ `要素$/ `属性~値$ / `~comment$ ]の内側に許容される。 加えて,他の節にて述べられるように、~textが置かれる所に基づいて, ~text内に何が許容され何が許容されないかの拘束が更に課される。 ◎ Text is allowed inside elements, attribute values, and comments. Extra constraints are placed on what is and what is not allowed in text based on where the text is to be put, as described in the other sections.

12.1.3.1. 改行文字

~HTMLにおける `改行文字@ ( newline )は、次のいずれかで表現されて~MAY:

  • `000D^U CARRIAGE RETURN `CR^smb
  • `000A^U LINE FEED `LF^smb
  • 次に与える順の文字~並び ⇒ `000D^U `CR^smb `000A^U `LF^smb
◎ Newlines in HTML may be represented either as U+000D CARRIAGE RETURN (CR) characters, U+000A LINE FEED (LF) characters, or pairs of U+000D CARRIAGE RETURN (CR), U+000A LINE FEED (LF) characters in that order.

`文字~参照$が許容される所では、 `000A^U `LF^smb を表す文字~参照も`改行文字$を表現する(が、 `000D^U `CR^smb 表す文字~参照はそうでない)。 ◎ Where character references are allowed, a character reference of a U+000A LINE FEED (LF) character (but not a U+000D CARRIAGE RETURN (CR) character) also represents a newline.

12.1.4. 文字~参照

他の節にて述べたある種の事例においては、`~text$には `文字~参照@ ( character reference )を混ぜても~MAY。 これを利用すれば、さもなければ`~text$内に合法に含めれない文字を~escapeできる。 ◎ In certain cases described in other sections, text may be mixed with character references. These can be used to escape characters that couldn't otherwise legally be included in text.

文字~参照は、 `0026^U `&^smb から開始され,次の 3 種いずれかが後続してい~MUST: ◎ Character references must start with a U+0026 AMPERSAND character (&). Following this, there are three possible kinds of character references:

有名~文字~参照: ◎ Named character references

次に与える順の文字~並び:

  1. `有名~文字~参照$ 節に与えるいずれかの名前(文字大小は区別される)
  2. ❝;
◎ The ampersand must be followed by one of the names given in the named character references section, using the same case. The name must be one that is terminated by a U+003B SEMICOLON character (;).
10 進~数値文字~参照: ◎ Decimal numeric character reference

次に与える順の文字~並び:

  1. ❝#
  2. 1 個以上の`~ASCII数字$からなる並びであって,[ 下の定義に則って許容される符号位置 ]に対応する基数 10 の整数を表現するもの
  3. ❝;
◎ The ampersand must be followed by a U+0023 NUMBER SIGN character (#), followed by one or more ASCII digits, representing a base-ten integer that corresponds to a code point that is allowed according to the definition below. The digits must then be followed by a U+003B SEMICOLON character (;).
16 進~数値文字~参照: ◎ Hexadecimal numeric character reference

次に与える順の文字~並び:

  1. ❝#
  2. [ ❝x / ❝X ]
  3. 1 個以上の`~ASCII~hex数字$からなる並びであって,[ 下の定義に則って許容される符号位置 ]に対応する基数 16 の整数を表現するもの
  4. ❝;
◎ The ampersand must be followed by a U+0023 NUMBER SIGN character (#), which must be followed by either a U+0078 LATIN SMALL LETTER X character (x) or a U+0058 LATIN CAPITAL LETTER X character (X), which must then be followed by one or more ASCII hex digits, representing a hexadecimal integer that corresponds to a code point that is allowed according to the definition below. The digits must then be followed by a U+003B SEMICOLON character (;).

上に述べた数値文字~参照による形では、次を除く符号位置を参照することが許容される ⇒ `000D^U `CR^smb / `非文字$ /[ `制御文字$のうち`~ASCII空白$でないもの ] ◎ The numeric character reference forms described above are allowed to reference any code point excluding U+000D CR, noncharacters, and controls other than ASCII whitespace.

`0026^U `&^smb は、次に与える順の文字~並びが後続するならば, `多義的amp@ ( ambiguous ampersand )とされる:

  1. 1 個以上の`~ASCII英数字$からなる並びであって,`有名~文字~参照$ 節に与えるどの名前にも合致しないもの
  2. ❝;
◎ An ambiguous ampersand is a U+0026 AMPERSAND character (&) that is followed by one or more ASCII alphanumerics, followed by a U+003B SEMICOLON character (;), where these characters do not match any of the names given in the named character references section.

12.1.5. ~CDATAsec

`~CDATAsec@ ( CDATA section )は、次に与える順の文字~並びで~MUST: ◎ CDATA sections must consist of the following components, in this order:

  1. 文字列 `<![CDATA[^l ◎ The string "<![CDATA[".
  2. 0 〜 1 個の[ `~text$であって,文字列 `]]>^l を包含しないもの ] ◎ Optionally, text, with the additional restriction that the text must not contain the string "]]>".
  3. 文字列 `]]>^l ◎ The string "]]>".

~CDATAsecを利用できるのは、外来の内容(~MathML/~SVG)内に限られる。 この例では、~CDATAsecを利用して,~MathML `ms$e 要素の内容を~escapeしている: ◎ CDATA sections can only be used in foreign content (MathML or SVG). In this example, a CDATA section is used to escape the contents of a MathML ms element:

`CDATA-1^xCode

12.1.6. ~comment

`~comment@ (comment )は、次に与える順の文字~並びで~MUST: ◎ Comments must have the following format:

  1. 文字列 `<!--^l ◎ The string "<!--".
  2. 次をすべて満たすような`~text$:

    • `>^l から開始しない
    • `->^l から開始しない
    • `<!--^l を包含しない
    • `-->^l を包含しない
    • `--!>^l を包含しない
    • `<!-^l で終端しない

    (特に,空~文字列はこれらを満たす)

    ◎ Optionally, text, with the additional restriction that the text must not start with the string ">", nor start with the string "->", nor contain the strings "<!--", "-->", or "--!>", nor end with the string "<!-".
  3. 文字列 `-->^l ◎ The string "-->".

注記: `~text$は 文字列 `<!^l で終端することは 許容される — 次の様に: `<!--お気に入りの演算子は: > と <!-->^c ◎ The text is allowed to end with the string "<!", as in <!--My favorite operators are > and <!-->.

12.2. ~HTML文書の構文解析-法

【 この節の内容は、未訳。 】

12.3. ~HTML素片の直列化-法

`~HTML素片~直列化~algo@ は、所与の ~DOM[ `Element$I / `Document$I / `DocumentFragment$I ]~node %~node に対し,文字列を返す: ◎ The following steps form the HTML fragment serialization algorithm. The algorithm takes as input a DOM Element, Document, or DocumentFragment referred to as the node, and returns a string.

注記: この~algoは、 %~node 自身ではなく,その子たちを直列化する。 ◎ This algorithm serializes the children of the node being serialized, not the node itself.

  1. %s ~LET 空~文字列 ◎ Let s be a string, and initialize it to the empty string.
  2. ~IF[ %~node は `template$e 要素である ] ⇒ %~node ~SET %~node の`~template内容$( `DocumentFragment$I ~node ) ◎ If the node is a template element, then let the node instead be the template element's template contents (a DocumentFragment node).
  3. %~node の~EACH( 子~node %現~node ) に対し,`木~順序$で ⇒ 下に与える %現~node を “直列化する下位手続き” を走らせた結果を %s に付加する ◎ For each child node of the node, in tree order, run the following steps: ◎ Let current node be the child node being processed. ◎ Append the appropriate string from the following list to s:
  4. ~RET %s ◎ ↓↓

上の目的における %現~node を “直列化する下位手続き” は、 %現~node に応じて,次を走らす: ◎ ↑

`Element^I である ◎ If current node is an Element
  1. %結果 ~LET 空~文字列 ◎ ↓
  2. %~tag名 ~LET [ %現~node は[ `~HTML名前空間$ / `~MathML名前空間$ / `~SVG名前空間$ ]に属するならば %現~node の局所~名 / ~ELSE_ %現~nodeの有修飾~名 ] ◎ If current node is an element in the HTML namespace, the MathML namespace, or the SVG namespace, then let tagname be current node's local name. Otherwise, let tagname be current node's qualified name.
  3. `003C^U `<^smb を %結果 に付加する ◎ ↓
  4. %~tag名 を %結果 に付加する ◎ Append a U+003C LESS-THAN SIGN character (<), followed by tagname.

    注記: [ `~HTML構文解析器$ / `createElement()$m ]により作成された`~HTML要素$に対しては、 %~tag名 は小文字になる。 ◎ For HTML elements created by the HTML parser or createElement(), tagname will be lowercase.

  5. %現~node が有する ~EACH( 属性 %属性 ) に対し,次に与える順の文字~並びを %結果 に付加する:

    1. `0020^U SPACE
    2. %属性 の`直列形の名前$
    3. ❝=
    4. ❝"
    5. %属性 の値を`属性~mode^iの下で`~escape$した結果
    6. ❝"
    ◎ For each attribute that the element has, append a U+0020 SPACE character, the attribute's serialized name as described below, a U+003D EQUALS SIGN character (=), a U+0022 QUOTATION MARK character ("), the attribute's value, escaped as described below in attribute mode, and a second U+0022 QUOTATION MARK character (").

    この段の目的における %属性 の `直列形の名前@ は、 %属性 が属する名前空間に応じて,次にされ~MUST: ◎ An attribute's serialized name for the purposes of the previous paragraph must be determined as follows:

    なし ◎ If the attribute has no namespace
    %属性 の局所~名 ◎ The attribute's serialized name is the attribute's local name.
    注記: `~HTML要素$において,[ `~HTML構文解析器$ / `Element.setAttribute()^m ]により設定された属性に対しては、局所~名は小文字になる。 ◎ For attributes on HTML elements set by the HTML parser or by Element.setAttribute(), the local name will be lowercase.
    `~XML名前空間$ ◎ If the attribute is in the XML namespace
    次に与える順の文字~並び ⇒ 文字列 `xml:^l, %属性 の局所~名 ◎ The attribute's serialized name is the string "xml:" followed by the attribute's local name.
    `~XMLNS名前空間$
    • %属性 の局所~名 ~EQ `xmlns^c ならば 文字列 `xmlns^l
    • ~ELSE_ 次に与える順の文字~並び ] ⇒ 文字列 `xmlns:^l, %属性 の局所~名
    ◎ If the attribute is in the XMLNS namespace and the attribute's local name is xmlns ◎ The attribute's serialized name is the string "xmlns". ◎ If the attribute is in the XMLNS namespace and the attribute's local name is not xmlns ◎ The attribute's serialized name is the string "xmlns:" followed by the attribute's local name.
    `~XLink名前空間$ ◎ If the attribute is in the XLink namespace
    次に与える順の文字~並び ⇒ 文字列 `xlink:^l, %属性 の局所~名 ◎ The attribute's serialized name is the string "xlink:" followed by the attribute's local name.
    その他の名前空間 ◎ If the attribute is in some other namespace
    %属性 の有修飾~名 ◎ The attribute's serialized name is the attribute's qualified name.

    属性たちの正確な順序は~UAにより定義され,元の~markupにて属性が与えられた順序などの要因にも依存し得るが、~sort順序は,安定的 — すなわち、要素に対しこの~algoを続けて呼出しても,属性たちが直列化される順序は同じ — で~MUST。 ◎ While the exact order of attributes is UA-defined, and may depend on factors such as the order that the attributes were given in the original markup, the sort order must be stable, such that consecutive invocations of this algorithm serialize an element's attributes in the same order.

  6. `003E^U `>^smb を %結果 に付加する ◎ Append a U+003E GREATER-THAN SIGN character (>).
  7. ~IF[ %現~node は[ `area$e / `base$e / `basefont$e / `bgsound$e / `br$e / `col$e / `embed$e / `frame$e / `hr$e / `img$e / `input$e / `keygen$e / `link$e / `meta$e / `param$e / `source$e / `track$e / `wbr$e ]要素である ] ⇒ ~RET %結果 ◎ If current node is an area, base, basefont, bgsound, br, col, embed, frame, hr, img, input, keygen, link, meta, param, source, track or wbr element, then continue on to the next child node at this point.
  8. 次に与える順の文字~並びを %結果 に付加する:

    1. %現~node に対し`~HTML素片~直列化~algo$を(再帰的に)走らせた結果
    2. `003C^U `<^smb
    3. ❝/
    4. %~tag名
    5. `003E^U `>^smb
    ◎ Append the value of running the HTML fragment serialization algorithm on the current node element (thus recursing into this algorithm for that element), followed by a U+003C LESS-THAN SIGN character (<), a U+002F SOLIDUS character (/), tagname again, and finally a U+003E GREATER-THAN SIGN character (>).
  9. ~RET %結果 ◎ ↑
`Text^I である ◎ If current node is a Text node
  1. %data ~LET %現~node の`data^m ~IDL属性の値
  2. ~IF[ %現~node の親は[ `style$e / `script$e / `xmp$e / `iframe$e / `noembed$e / `noframes$e / `plaintext$e ]要素である ] ⇒ ~RET %data
  3. ~IF[ %現~node の親は `noscript$e 要素である ]~AND[ %現~node に対する`~scriptingは可能化-$されている ] ⇒ ~RET %data
  4. ~RET %data を`~escape$した結果
◎ If the parent of current node is a style, script, xmp, iframe, noembed, noframes, or plaintext element, or if the parent of current node is a noscript element and scripting is enabled for the node, then append the value of current node's data IDL attribute literally. ◎ Otherwise, append the value of current node's data IDL attribute, escaped as described below.
`Comment^I である ◎ If current node is a Comment

~RET 次に与える順の文字~並び

  1. `003C^U `<^smb
  2. ❝!
  3. ❝-
  4. ❝-
  5. %現~node の `data^c ~IDL属性の値
  6. ❝-
  7. ❝-
  8. `003E^U `>^smb
◎ Append the literal string "<!--" (U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, U+002D HYPHEN-MINUS), followed by the value of current node's data IDL attribute, followed by the literal string "-->" (U+002D HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN).
`ProcessingInstruction^I である ◎ If current node is a ProcessingInstruction

~RET 次に与える順の文字~並び:

  1. `003C^U `<^smb
  2. ❝?
  3. %現~node の `target^m ~IDL属性の値
  4. `0020^U SPACE
  5. %現~node の `data^m ~IDL属性の値
  6. `003E^U `>^smb
◎ Append the literal string "<?" (U+003C LESS-THAN SIGN, U+003F QUESTION MARK), followed by the value of current node's target IDL attribute, followed by a single U+0020 SPACE character, followed by the value of current node's data IDL attribute, followed by a single U+003E GREATER-THAN SIGN character (>).
`DocumentType^I である ◎ If current node is a DocumentType

~RET 次に与える順の文字~並び:

  1. `003C^U `<^smb
  2. ❝!
  3. ❝D
  4. ❝O
  5. ❝C
  6. ❝T
  7. ❝Y
  8. ❝P
  9. ❝E
  10. `0020^U SPACE
  11. %現~node の `name^m ~IDL属性の値
  12. `003E^U `>^smb
◎ Append the literal string "<!DOCTYPE" (U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+0044 LATIN CAPITAL LETTER D, U+004F LATIN CAPITAL LETTER O, U+0043 LATIN CAPITAL LETTER C, U+0054 LATIN CAPITAL LETTER T, U+0059 LATIN CAPITAL LETTER Y, U+0050 LATIN CAPITAL LETTER P, U+0045 LATIN CAPITAL LETTER E), followed by a space (U+0020 SPACE), followed by the value of current node's name IDL attribute, followed by the literal string ">" (U+003E GREATER-THAN SIGN).

◎ The result of the algorithm is the string s.

`~HTML素片~直列化~algo$の出力を`~HTML構文解析器$で構文解析した結果は、元の木~構造にならない~~可能性もある。 直列化して再解析する段を往来しないような木~構造は、`~HTML構文解析器$ 自身からの生産され得る — そのような事例では概して、適合していないが。 ◎ It is possible that the output of this algorithm, if parsed with an HTML parser, will not return the original tree structure. Tree structures that do not roundtrip a serialize and reparse step can also be produced by the HTML parser itself, although such cases are typically non-conforming.

具体例として, `textarea$e 要素に `Comment^I ~nodeが付加されていた場合、それを直列化して再解析した結果は,~commentは~text~control内に表示されることになる。 同様に、~DOM操作による結果,要素が[ 文字列 `-->^l をそのまま包含するような~comment ]を包含する場合、その要素を直列化して再解析した結果の~commentは,その地点で切落とされ、残りの部分は~markupとして解釈されることになる。 他にも、 `script$e 要素に文字列 `</script>^l を伴う `Text$I ~nodeを包含させた場合や, `p$e 要素に `ul$e 要素を包含させた場合などが挙げられる( `ul$e 要素の`開始tag$は `p$e に対する終了tagを黙示するので)。 ◎ For instance, if a textarea element to which a Comment node has been appended is serialized and the output is then reparsed, the comment will end up being displayed in the text control. Similarly, if, as a result of DOM manipulation, an element contains a comment that contains the literal string "-->", then when the result of serializing the element is parsed, the comment will be truncated at that point and the rest of the comment will be interpreted as markup. More examples would be making a script element contain a Text node with the text string "</script>", or having a p element that contains a ul element (as the ul element's start tag would imply the end tag for the p).

これは、~XSS攻撃を可能化し得る。 例えば,ある頁において、利用者に何らかの~font-family名を手入力してもらい,それを~DOMを介して ~CSS `style$e ~blockの中に挿入してから, `innerHTML$m ~IDL属性を用いて `style$e 要素の~HTML直列化を取得しているとする。 利用者が~font-family名として `</style><script>攻撃~code</script>^l を手入力した場合、 `innerHTML$m は[ 他の文脈にて構文解析されたときには,元の~DOM内には存在しない `script$e ~nodeを包含することになる ]ような~markupを返すことになる。 ◎ This can enable cross-site scripting attacks. An example of this would be a page that lets the user enter some font family names that are then inserted into a CSS style block via the DOM and which then uses the innerHTML IDL attribute to get the HTML serialization of that style element: if the user enters "</style><script>attack</script>" as a font family name, innerHTML will return markup that, if parsed in a different context, would contain a script node, even though no script node existed in the original DOM.

例えば、次の~markupを考える: ◎ For example, consider the following markup:

`serializing-1^xCode

これを構文解析した結果は次になる: ◎ This will be parsed into:

  • `html$e
    • `head$e
    • `body$e
      • `form$e `id$a=`outer^l
        • `div$e
          • `form$e `id$a=`inner^l
            • `input$e

`input$e 要素は、内縁 `form$e 要素( `inner^l )に所有されることになる。 ここで,この木~構造が直列化され再解析された場合、開始tag `<form id="inner">^e は無視されることになり, `input$e 要素は 外縁 `form$e 要素に所有されることになる。 ◎ The input element will be associated with the inner form element. Now, if this tree structure is serialized and reparsed, the <form id="inner"> start tag will be ignored, and so the input element will be associated with the outer form element instead.

`serializing-2^xCode
  • `html$e
    • `head$e
    • `body$e
      • `form$e `id$a=`outer^l
        • `div$e
          • `input$e

別の例として、次の~markupを考える: ◎ As another example, consider the following markup:

`serializing-3^xCode

これを構文解析した結果は次になる: ◎ This will be parsed into:

  • `html$e
    • `head$e
    • `body$e
      • `a$e
        • `a$e
        • `table$e

すなわち、2 つの `a$e 要素は入子にされる — 2 個目の `a$e は`親が違えられ$るので。 直列化して再解析する往来~後には、[ 2 つの `a$e, `table$e ]要素は,互いに同胞になる — 2 個目の開始tag `<a>^c が, 1 個目の `a$e 要素を暗黙的に閉じるので。 ◎ That is, the a elements are nested, because the second a element is foster parented. After a serialize-reparse roundtrip, the a elements and the table element would all be siblings, because the second <a> start tag implicitly closes the first a element.

`serializing-4^xCode
  • `html$e
    • `head$e
    • `body$e
      • `a$e
      • `a$e
      • `table$e

歴史的な理由から、この~algoは,[ `pre$e / `textarea$e / `listing$e ]要素~内の先頭の `000A^U `LF^smb 文字は往来しない — ~markupが適合していようが(廃用にされた `listing^e は適合し得ないが)。 `~HTML構文解析器$は、構文解析-時にそのような文字を落とすことになるが、この~algoは,落とされた `000A^U `LF^smb を直列化することはない。 ◎ For historical reasons, this algorithm does not round-trip an initial U+000A LINE FEED (LF) character in pre, textarea, or listing elements, even though (in the first two cases) the markup being round-tripped can be conforming. The HTML parser will drop such a character during parsing, but this algorithm does not serialize an extra U+000A LINE FEED (LF) character.

例えば、次の~markupを考える: ◎ For example, consider the following markup:

`serializing-5^xCode

この文書を最初に構文解析したとき、この `pre$e 要素の`子~text内容$の頭部にある改行文字は, 1 個だけに減る。 直列化して再解析する往来~後には、また 1 個~減り,`子~text内容$は `Hello.^l だけになる。 ◎ When this document is first parsed, the pre element's child text content starts with a single newline character. After a serialize-reparse roundtrip, the pre element's child text content is simply "Hello.".

(上の~algoの目的において)所与の %文字列 を `~escape@ するときは、次の手続きを走らす: ◎ Escaping a string (for the purposes of the algorithm above) consists of running the following steps:

  1. %文字列 内の各~文字 `&^l を文字列 `&amp;^l に置換する ◎ Replace any occurrence of the "&" character by the string "&amp;".
  2. %文字列 内の各~文字 `00A0^U NO-BREAK SPACE を `&nbsp;^l に置換する ◎ Replace any occurrences of the U+00A0 NO-BREAK SPACE character by the string "&nbsp;".
  3. ~IF[ この~algoは `属性~mode^i で呼出されている ] ⇒ %文字列 内の各~文字 `"^l を文字列 `&quot;^l に置換する ◎ If the algorithm was invoked in the attribute mode, replace any occurrences of the """ character by the string "&quot;".
  4. ~ELSE:

    1. %文字列 内の各~文字 `<^l を文字列 `&lt;^l に置換する
    2. %文字列 内の各~文字 `>^l を文字列 `&gt;^l に置換する
    ◎ If the algorithm was not invoked in the attribute mode, replace any occurrences of the "<" character by the string "&lt;", and any occurrences of the ">" character by the string "&gt;".

12.4. ~HTML素片の構文解析-法

【 この節の内容は、未訳。 】

12.5. 有名~文字~参照

【 この節の内容は、別ページにて。 】