* 開始タグ (HTML)

** 仕様書

[REFS[
- [30] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-06-15 22:31:32 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#element-restrictions>
- [33] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-06-15 22:31:32 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody>
- [36] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-06-15 22:31:32 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#serializing-html-fragments>
]REFS]

** 開始タグ直後の改行

[27] [[HTML]] のいくつかの[[要素]]では、[[開始タグ]]直後の[[改行]]が1つだけ無視されることになっています。

[EG[
[28] 例えば、
[PRE(HTML code)[
<textarea>
hoge fuga
</textarea>
]PRE]
... の [CODE(HTMLe)@en[[[textarea]]]] [[要素]]の[[内容]]は、
「hoge fuga」の後に[[改行]]が1つであり、先頭の[[改行]]は無視されます。
]EG]

;; [29] [[SGML]] の同様の規定に影響されたのか、それとも偶然 (あるいは必然?
[[どっち?]]) に一致したのかは不明です。

[31] これに該当するのは、次の2つの[[要素]]です [SRC[>>30]]。
[REFS[
- [CODE(HTMLe)@en[[[pre]]]]
- [CODE(HTMLe)@en[[[textarea]]]]
]REFS]

[32] これらの[[要素]]にあっては、[[開始タグ]]の直後に[[改行]]を1つ置いても[['''構いません''']]。
特に[[内容]]の先頭が[[改行]]である場合には、[[改行]]が1つ余分になければ[['''なりません''']]。 [SRC[>>30]]

[34] [[HTML構文解析器]]に関する規定 [SRC[>>33]] によると、 >>31 の他に更に [CODE(HTMLe)@en[[[listing]]]]
[[要素]]も同様の扱いを受けます。

;; [35] [CODE(HTMLe)@en[[[listing]]]] [[要素]]は[[廃止]]されているので、[[HTML]]
の[[構文]]の適合性の規定上は存在しないことになっています。

[37] [[HTML]] の[[直列化]]の規定でも、 >>31 と >>34 の3つの[[要素]]の最初の[[子供]]の[[テキスト節点]]が
[CODE(char)[[[U+000A]]]] から始まる場合、 [CODE(char)[[[U+000A]]]] を2つにしなければ[['''ならない''']]となっています
[SRC[>>36]]。

;; [38] 他に [CODE(char)[[[U+000D]]]] の場合も余分に [CODE(char)[[[U+000A]]]] を挿入しないと[[改行]]が失われてしまうのですが、
[[直列化]]算法は全体的に [CODE(char)[[[U+000D]]]] を想定していないようです。

* 開始タグ (SGML)

[1] [[要素]]が始まる場所の目印となる[[タグ]]が、
[DFN[[RUBYB[開始タグ] [start tag]]]]です。 
[4] 開始タグの中には、要素の[[属性]]を記述できます ([[属性指定並び]])。

** 仕様書

[REFS[
- [22] [[JIS X 4151]]‐1992
-- [CITE[6.3.1.1 開始タグの省略]]
-- [CITE[6.4 開始タグ]]
]REFS]

** 開始タグの構文

[FIG[
[15]
- [CODE(ABNF)[[DFN[開始タグ]] := 完全な開始タグ / 空開始タグ / 閉じない開始タグ / [ABBR[net] [ヌル終了タグ]] 可能開始タグ ;; [[JIS X 4151]]‐1992 (14), (15)]]
- [CODE(ABNF)[[DFN[完全な開始タグ]] := [CODE(SGML)[[[stago]]]] [[文書型指定]] [[共通識別子指定]] [[属性指定並び]] *[[s]] [CODE(SGML)[[[tagc]]]] ;; (14), (17)]]
- [CODE(ABNF)[[DFN[閉じない開始タグ]] := [CODE(SGML)[stago]] 文書型指定 共通識別子指定 属性指定並び *s [CODE(regex)[(?= [CODE(SGML)[stago]] / [CODE(SGML)[etago]])]] ;; (17)]]
- [CODE(ABNF)[[DFN[[[空開始タグ]]]] := [CODE(SGML)[stago]] [CODE(SGML)[tagc]] ;; (16)]]
- [CODE(ABNF)[[DFN[[ABBR[net] [ヌル終了タグ]] 可能開始タグ]] := [CODE(SGML)[stago]] 共通識別子指定 属性指定並び *s [CODE(SGML)[[[net]]]] ;; (18)]]
]FIG]

[17] 構文の通り、[[基本文書型]]以外では [ABBR[net] [ヌル終了タグ]] 
可能開始タグが利用できないことになっています。
(基本文書型のタグ以外は読み飛ばすという処理がやや面倒になるからでしょうか。)

[18] 閉じない開始タグが使えるのは、直後に
[CODE(SGML)[stago]] 又は [CODE(SGML)[etago]]
と同じ文字列が続く場合のみです。但し、
それらの文字列が実際に開始タグ又は終了タグの開きとして認知されるかは別問題になります。

[16] 開始タグの長さは、属性指定並び中の参照を置換する前の状態で、区切子
[CODE(SGML)[stago]], [CODE(SGML)[tagc]],
[CODE(SGML)[net]] を除き、 [CODE(SGML)[[[TAGLEN]]]]
以下でなければなりません。 (JIS 6.4.2 参照。)

[[#comment]]


* 開始タグの省略

[2] SGML では、条件が揃っていれば曖昧でない限り開始タグを省略できます。例えば、[SAMP(SGML)[電話番号]]要素が必ず[SAMP(SGML)[国番号]]要素から始まると定義されていて、その開始タグが省略可能と宣言されていれば、[SAMP[国番号]]要素の開始タグは省略できます。

[3] [[XML]] では開始タグは省略できませんから、
どんな場合でも必ず書かなければなりません。

[10] 開始タグが省略できるのは、次の条件を満たす時です。
= [4] [タグの省略が許されていること]
[[SGML宣言]]で [CODE(SGML)[[[OMITTAG]] YES]] になっていることが大前提として必要です。
[SRC[JIS X 4151‐1992 6.3.1]]
= [5] [開始タグの省略が許されていること]
当該[[要素型]]の[[要素型宣言]]において、
開始タグの省略が許されている ([CODE(SGML)[o]] である)
ことが必要です。
= [6] [文脈上自明であること]
その要素が[[文脈]]上必須であって、
しかもそこに現れ得る他の要素型の要素がどれも文脈上[[任意選択]]でなければなりません。
[SRC[JIS X 4151‐1992 6.3.1.1]]
-- 例 : [SAMP(SGML)[<![[ELEMENT]] parent - - (c?, d)>]],
[SAMP(SGML)[<!ELEMENT c - - ANY>]],
[SAMP(SGML)[<!ELEMENT d o o (#PCDATA)>]]
において、 [SAMP(SGML)[<parent>''<d>''d-content</d></parent>]]
の開始タグ [CODE(SGML)[<d>]] は省略できます。
= [7] [必須属性を持たないこと]
但し、必須の[[属性]]があるときは省略できません。 [SRC[JIS X 4151‐1992 6.3.1.1 (1)]]
= [8] [宣言内容でないこと]
[[宣言内容]]を持つ時 (すなわち、内容が[[文字データ]]の時、
[[解析可能文字データ]]の時、任意の時、[[強制空要素]]である時) には省略できません。  [SRC[JIS X 4151‐1992 6.3.1.1 (1)]]
= [9] [空要素でないこと]
その要素の[[実現値]]の[[内容]]が[[空]]であるときは、
省略できません。 [SRC[JIS X 4151‐1992 6.3.1.1 (2)]]
= [12] [曖昧性を生じないこと]
以上の条件を満たしたとしても、他の要素との関係で曖昧性が生じるときは、省略できません。
[SRC[JIS X 4151‐1992 6.3.1]]
-- 例: その要素の内容が[[短縮参照列]]から始まり、
しかもその[[短縮参照区切子]]の対応付けがその要素に関連付けられた[[短縮参照写像]]により変更されている場合
[SRC[JIS X 4151‐1992 6.3.1]]

[11] なお、開始タグを省略した場合、[[属性指定並び]]は空とみなされます。

[20]
''2003-12-15: 謎のサンプル - マーク付けノート'' <http://www.satoshii.org/markup/notes/2003/12#date15>: >>6 に該当すると思われる例。

[25]
[CITE@ja[冬様もすなる☆日記というもの (2007年9月)]]
([[わかば]] 著, [CODE[2007-09-23 12:18:20 +09:00]] 版) 
<https://suika.suikawiki.org/~wakaba/d/d200709>

** 一見開始タグに見えない開始タグの存在

[23] [[実体参照]]を使用することで、
文書実体中に直接開始タグを記述しなくても開始タグを含めることができます。

例:
[PRE(SGML)[
<!ENTITY start "<p>">
[INS[...]]
&start;あれこれそれどれ</p>
]PRE]

[[名前指定実体参照]]ではなく[[短縮参照]]を使用すると、
より開始タグらしからぬ記述ができます。例えば、
前例の[[一般実体]] [CODE(SGML)[start]] が[[記録終了]]・[[記録開始]]の2連続と関連付けられているとすると、
[PRE(SGML)[
<p>段落その1
段落その2
]PRE]

のように書けます [WEAK[(ここでは、終了タグは省略可能であるとしています)]]。

(短縮参照はタグの存在を隠しますが、依然としてタグは存在しています。
その点で >>2- のタグの省略とは異なります。)

[24] ちなみに、実体を宣言する時に
[PRE(SGML)[
<!ENTITY start STARTTAG "p">
]PRE]

と書いても同じ結果が得られます。鍵語 [CODE(SGML)[[[STARTTAG]]]]
は、実体の[[置換文]]の最初に [CODE(SGML)[[[STAGO]]]] を、
最後に [CODE(SGML)[[[TAGC]]]] を補うことを求めています。

** stago の直後の s

[19] <http://groups.google.co.jp/groups?threadm=ahjfl6%24e3l%241%40yagi.ecei.tohoku.ac.jp>: [SAMP(SGML)[< A>]] が開始タグとして認知されるかどうかの話題。

認知されるのではないかという [[kabe]]
たんの主張に対し、 [[mimasa]] たんは認知されないとのご意見。

[21]
特許出願用 HTML のように >>19 を認めている仕様もあります。
<http://openlab.ring.gr.jp/k16/htmllint/notice.html#jpo>

* メモ

[26]
[CITE@ja[WEB受付窓口及び金融円滑化「大臣目安箱」]] ([TIME[2008-10-16 15:29:37 +09:00]] 版) <https://www.fsa.go.jp/opinion/>

[PRE(HTML invalid example code)[
<body< text="#10115f">
]PRE]

[13] [CITE@en[Elements with duplicated attributes are not nonceable.]]
([[mikewest]]著, [TIME[2017-11-27 17:28:11 +09:00]])
<https://github.com/w3c/webappsec-csp/commit/649393514b9aaf9277bfd21ee1834f4befd029be>

[14] [CITE@en[Update customized built-in elements is="" interaction]]
([[domenic]]著, [TIME[2018-02-14 11:31:01 +09:00]])
<https://github.com/whatwg/html/commit/e5dc6bf18f356225d90decc47ac6ed3be94728a7>