[37] [[要素]]の[F[子供]]のことを、[DFN[[F[[RUBYB[[[内容]]]@en[content]]]]]]ともいいます。

* 仕様書

[REFS[
- [55] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2017-09-16 15:17:26 +09:00]]) <https://html.spec.whatwg.org/#concept-element-content-model>
- [54] [CITE@en-US[ARIA in HTML]] ([TIME[2017-09-10 07:44:56 +09:00]]) <https://w3c.github.io/html-aria/#allowed-aria-roles-states-and-properties>
]REFS]

* [DFN[要素の内容の適合性]]

[39] [[著者]]は、[[文書の適合性]]の要件に従って[[文書]]を制作しなければなりません。
[[要素]]においては、[[要素]]の[F[内容]]が、その制約に従わなければなりません。

[40] 原則として、[[要素]]の[F[内容]]は、[[適用可能な仕様書]]の[[内容モデル]]その他の制約に従わなければなりません。

;; [53] [CODE[role]] [[属性]]が指定されている場合、その[[要素]]の制約に加えて、
[[役割]]の制約も課されます。

* 内容モデル

[1] [DFN[[RUBYB[内容モデル]@en[content model]]]] ([DFN[内容模型]]) とは、
[[要素]]の[[内容]]に関する制約、あるいはそれを記述する方法のことを言います。

[56] [[内容モデル]]は、基本的にその[[要素]]を定義する[[仕様書]]で規定されています。
[[HTML要素]]の[[内容モデル]]は [CITE[HTML Standard]] で規定されています [SRC[>>55]]。

[FIG(short list)[ [6] [[内容モデル]]の記述
- [[要素のカテゴリー]]
- [[内容モデル「なし」]]
- [[テキスト]]
- [[透過内容モデル]]
- [CODE[ANY]]
]FIG]

[HISTORY[
[3] 既に消失した内容モデル:
[FIG(short list)[
- [[双形性内容モデル]]
- [[半透過内容モデル]]
- [[ブロック水準要素]]
- [[行内要素]]
]FIG]

[7] [[HTML4]] から [[HTML5]] で大きな変更がありました。

[5] [[HTML5]] 内でも [TIME[2007年12月][2007-12]]に大きな変更がありました。
]HISTORY]



[57] [[ARIA]] は [CODE[role]] が明示的または暗示的に指定された[[要素]]の[[子孫]]の
[[HTML要素]]の制約を定めています [SRC[>>54]]。

[60] [[ARIA]] の [CODE[role]] に関する規定は [CITE[HTML Standard]] 
の[[要素]]に関する規定を覆す道理はありませんから、
両者の制約が共に適用されると考えられます。 [CODE[role]] の制約は多くの場合は[[フロー内容]]で、
多くの[[HTML要素]]の内容の制約も[[フロー内容]]ですから、
特に問題はありません。また[[語句内容]]や[[テキスト]]や[[空要素]]の[[内容モデル]]を持つ
[[HTML要素]]は、すべて[[フロー内容]]の[[部分集合]]と考えられますから、
やはり問題はありません。 [CODE[role]] の制約が[[語句内容]]で[[HTML要素]]の制約が[[語句内容]]または[[フロー内容]]の場合も、
問題はありません。それ以外に次のような場合があります。

- [58] 次の場合、[[要素]]本来が特別な[[内容モデル]]を持ち、
[CODE[role]] が[[フロー内容]]を求めるため、
両方の制約を満たす[[要素]]はなくなります。
-- [CODE[<[[tr]] [[role]]=[[row][role=row]]>]]
-- [CODE[<[[table]] [[role]]=[[table][role=table]]>]]
-- [CODE[<[[tbody]] [[role]]=[[row][role=rowgroup]]>]] (または [CODE[thead]], [CODE[tfoot]])
-- [CODE[<[[ul]] [[role]]=[[list][role=list]]>]] 
(または [CODE[ol]], [CODE[dl]], [CODE[menu]]) 他幾つかの [CODE[role]]
-- [CODE[<[[select]] [[role]]=[[listbox]]>]] 他幾つかの [CODE[role]]
-- [CODE[<[[datalist]] [[role]]=[[listbox]]>]]
-- [CODE[<[[optgroup]] [[role]]=[[group][role=group]]>]]
-- [CODE[<[[svg]] [[role]]=[[document][role=document]]>]] 他幾つかの [CODE[role]]
([[ARIA]] の当該規定は [[HTML要素]]のみ適用されると考えれば問題なしだが...))
-- [CODE[<[[math]] [[role]]=[[math][role=math]]>]]
([[ARIA]] の当該規定は [[HTML要素]]のみ適用されると考えれば問題なしだが...))
- [CODE[figure]] [[要素]]に [CODE[role=figure]], [CODE[role=presentation]]
が指定された場合、[[フロー内容]]であることが求められますが、
[CODE[figcaption]] が[[フロー内容]]ではないため、使えないことになります。
- [CODE[details]] [[要素]]に [CODE[role=group]]
が指定された場合、[[フロー内容]]であることが求められますが、
[CODE[summary]] が[[フロー内容]]ではないため、使えないことになります。
- [CODE[fieldset]] [[要素]]に [CODE[role=group]], [CODE[role=presentation]]
が指定された場合、[[フロー内容]]であることが求められますが、
[CODE[legend]] が[[フロー内容]]ではないため、使えないことになります。
- [CODE[video]] [[要素]]や [CODE[audio]] [[要素]]に [CODE[role=application]] 
が指定された場合、[[フロー内容]]であることが求められますが、
[CODE[source]] や [CODE[track]] が[[フロー内容]]ではないため、使えないことになります。
- [CODE[object]] [[要素]]に [CODE[role=document]] 他幾つかの [CODE[role]]
が指定された場合、[[フロー内容]]であることが求められますが、
[CODE[param]] が[[フロー内容]]ではないため、使えないことになります。
- [CODE[div]] [[要素]]に [CODE[role=list]] 他幾つかの [CODE[role]]
が指定された場合で、 [CODE[dl]] [[要素]]で使われている場合、
[CODE[dt]] も [CODE[dd]] も[[フロー内容]]ではないため、使えないことになります。
- [CODE[ruby]] [[要素]]に [CODE[role=list]] 他幾つかの [CODE[role]]
が指定された場合、[[フロー内容]]であることが求められますが、
[CODE[rt]], [CODE[rp]] が[[フロー内容]]ではないため、使えないことになります。

;; [59] [[ARIA]] には [CODE[role]] による[[要素のカテゴリー]]の規定もあります
([[要素のカテゴリー]]参照)。
これを文字通り適用すればこれらも見かけ上解決できる場合がありますが、
[[要素]]の[[内容モデル]]の制約は破綻します。例えば
[CODE[li]] [[要素]]は [CODE[role=presentation]] 
を指定すると[[フロー内容]]になると解釈すれば、
[CODE[<[[ul]] [[role=list]]><[[li]] [[role=presentation]]>]]
は問題ないことになります。ところが同時に
[CODE[<[[div]]><[[li]] [[role=presentation]]>]]
も許されることになります。このような規則は誰も利しません。

* 閲覧文脈にない文書

[41] [[節点]]の[F[節点文書]]の[F[閲覧文脈]]が [[null]] なら、
[[文書の適合性]]に関する規定は適用されません。 [SRC[[[HTML Standard]]]]

[EG[
[42] [[雛形内容]]の[F[節点文書]]が[[閲覧文脈]]中にない時、この条項が適用されます
[SRC[[[HTML Standard]]]]。つまりほとんどの場合 [CODE(HTMLe)@en[template]]
[[要素]]の中身の[[内容モデル]]や[[属性値]]の制約は適用されません。
]EG]

[43] その場合であっても、 [[HTML構文]]や[[XHTML構文]]の制約は適用されます [SRC[[[HTML Standard]]]]。

[44] この規定を文字通り適用すると、
[[Webブラウザー]]以外の[[適合検査器]]が意味をなさなくなってしまいます。
また、[[Webブラウザー]]が扱う[[閲覧文脈]]と切り離された[[文書]]、
例えば [CODE[responseXML]] や [CODE[new Document]] の[[文書]]の[[適合性検査]]ができなくなってしまいます。

[62] また、[[雛形内容]]にまったく何の検査もしないとすると、
[[適合性検査]]の主要な目的である[[文書]]中のエラーを発見して[[著者]]を助けるという目的が十分に達成できない可能性があります。

[EG[
[63] 例えば[[雛形内容]]に [CODE[a]] [[要素]]がある場合、
その [CODE[href]] [[属性]]は[[雛形]]の時点では使われることがなく、
[[スクリプト]]が設定した上で[[文書]]に[[挿入]]するかもしれませんから、
[CODE[href]] [[属性]]がないことで直ちにこれを[[不適合]]とすると、不便です。
これが [CITE[HTML Standard]] が適合性の規定を適用しないとする根拠と思われます。

[64] しかし、[[スクリプト]]が [CODE[href]] [[属性]]を設定するわけではなく、
単に[[著者]]が指定し忘れただけの可能性もあります。
そうした[[著者]]のミスを検出することが[[適合性検査]]の目的ですから、
[CODE[href]] [[属性]]の不存在を警告など何らかの形で表示する方が良いかもしれません。
意図的に省略している場合には、[[著者]]が設定で警告の表示を抑制できるような機能があると良いでしょう。

]EG]

[65] [[雛形内容]]は作成時は[[閲覧文脈]]を持たないのですが、
これを [[adopt]] すると[[閲覧文脈]]に属する場合があります。
特殊ケースではありますが、 [CODE[template]] 内であるにも関わらず[[適合性検査]]の対象となる場合があります。

[66] [[XSLTスタイルシート]]では[[雛形内容]]が [CODE[template]]
[[要素]]の[[子孫]]であるものとして処理されることになっています。
すると[[XSLTスタイルシート]]の[[適合性検査]]のときは、
[[雛形内容]]を [[XSLT]] [[仕様書]]の規定に従って検査するべきだということになります。

* 雛形内容

[35] [CODE(HTMLe)@en[template]] [[要素]]は、通常の[[内容]]とは別に、
[[雛形内容]]を持ちます。

;; [[雛形内容]]参照。

[46] 普通、[[雛形内容]]は[[内容モデル]]等の制約が適用されません (>>42)。

[HISTORY[
[45] 2016年7月までは [CODE(HTMLe)@en[template]] [[要素]]においては[[雛形内容]]が[[要素]]の[F[内容]]であると定められていました。
]HISTORY]

* 影木

[36] [[要素]]に[[影木]]が [[attach][attachShadow]] されている場合、
通常の[[内容]]とは別に、[[影木]]を持ちます。通常の[[内容]]も、
[[スロット]]の割り当て関係を持つことがあります。

;; [[影木]]、[[スロット]]を参照。

[51] 普通、[[影木]]は[[光木]]と同じ[F[節点文書]]に属しますから、
[[内容モデル]]等の制約は等しく適用されます。

* 歴史

[61] [[HTML]] における[[内容モデル]]の種別の歴史は、
[[要素の分類]]を参照。

** SGML / XML

[25] [[HTML]] でも[[内容モデル]]という語が使われています。語源としては
[[XML]] や [[SGML]] の[[内容モデル]]に由来していますが、
[[HTML]] は [[DTD]] を採用しておらず、実態は大きく異なっています。


[9] 
> [[文書]]の中で[[要素]]の[[開始タグ]]と[[終了タグ]]との間に出現する[[文字]]。 Content。
> 備考1. その文字は、[[データ]], [[真の部分要素]], [[天下部分要素]], その他の[[マーク]]又はこれらが混在したものとして解釈される。
> 備考2. 要素が[[明示内容参照]]又はその[[宣言済み内容]]が [CODE(SGML)[[[EMPTY]]]] ならば、内容は[[空]]である。
その場合、[[応用]]自身が内容のデータを生成してもよい。 [INS[([[JISX4151]]‐1992 定義 (189))]]

[10] JIS X 4151‐1992 6.6 に詳しい定義があります。

- [CODE(ABNF)[[DFN[内容]] := [ [[混合内容]] / [[要素内容]] / [[置換可能文字データ]] / [[文字データ]] ] ;; (24)]]
- [CODE(ABNF)[[DFN[混合内容]] := *([[データ文字]] / [[要素]] / [[他の内容]]) ;; (25)]]
- [CODE(ABNF)[[DFN[要素内容]] := *([[要素]] / [[他の内容]] / [[s]]) ;; (26)]]
- [CODE(ABNF)[[DFN[他の内容]] := [[注釈宣言]] / [[短縮参照使用宣言]] / [[連結集合使用宣言]] / [[処理指令]] / [CODE(SGML)[[[shortref]]]] / [[文字参照]] / [[一般実体参照]] / [[マーク区間宣言]] / [[Ee]] ;; (27)]]

[8] では、[[マーク区間]]の「内容」とは何か?
→[[マーク区間]>>11]参照。

[14] [[SGML]] や [[XML]] における[DFN[[RUBYB[内容モデル]@en[content model]]]]は、
[[要素]]の[[内容]]についての制約を記述する[[要素宣言]]の[[引数]](群)です。

[22] 
>
:内容モデル (content model):
許容できる[[要素内容]]を定義する[[モデル群]]及び[[例外]]を指定する[[要素宣言]]の[[引数]]。
([[JIS X 4151]]‐1992 3. (192))

- [23] [CODE(ABNF)[[DFN[内容モデル]] := ([[モデル群]] / [[ANY]]) [1*[[ps]] [[例外]] ] ;; (126)]]
- [12] [CODE(ABNF)[[DFN[例外]] := ([[排除要素]] [1*ps 添加要素]) / [[添加要素]] ;; (138)]]

[13] 
> ある型の[[要素]]について、
出現可能な[[子要素]]・子[[文字データ]]の種類とその順序を規定する単純な文法。
(<http://www.w3.org/TR/REC-xml#dt-content-model>, 
<http://www.w3.org/TR/REC-xml#sec-mixed-content>,
<http://www.w3.org/TR/REC-xml#determinism> を参照。)

[16] [[要素内容]]モデル:
- children = (choice / seq) [ occur ] ;; [47]
- cp = (child-type / choice / seq) [ occur ] ;; [48]
- choice = "(" [ [[S]] ] cp 1*( [ S ] "|" [ S ] cp) [ S ] ")" ;; [49]
- seq = "(" [ S ] *( [ S ] "," [ S ] cp) [ S ] ")" ;; [50]
- occur = "?" / "*" / "+"
- child-type = Name ;; 子要素型名

[24] [[混合内容]]モデル:
- Mixed = "(" [S] '#PCDATA' *([S] "|" [S] child-type) [S] ")" "*" / "(" [S] '#PCDATA' [S] ")"


[15] [[SGML]] では[[モデル群]]と[[例外]]のことを[[内容モデル]]と呼んでいるようです。
[CODE(SGML)@en[[[CDATA]]]] などの[[キーワード]]は[[内容モデル]]と呼ばないようですが、
[CODE(SGML)@en[[[ANY]]]] は[[内容モデル]]と呼ばれることもあり、
その指す範囲は必ずしも明確ではありません。

[20] [[XML]] では、[[要素内容]]における[[モデル群]]のことを[[内容モデル]]と定義しています
[SRC[>>122]]。 [CODE(SGML)@en[[[EMPTY]]]] などの[[キーワード]]や[[混合内容]]における[[モデル群]]はこの定義から除外されています。

[21] 一般的には、[[内容モデル]]という語の指す範囲は文脈にも依存しますが、
[[要素内容]]でも[[混合内容]]でも[[モデル群]]を総称して[[内容モデル]]と呼ぶことが多いようです。
[[キーワード]]をも[[内容モデル]]に含めることもよくあります。

[FIG(railroad)[
= |
== [[キーワード]]
== [[モデル群]]
= ?
== +
=== [CODE(SGML)@en[[[ps]]]]
== [[例外]]
]FIG]

[26] (広義の)[[内容モデル]]として利用できる[[キーワード]]には、
次のものがあります。
[FIG(short list)[
- [CODE(SGML)@en[[[CDATA]]]]
- [CODE(SGML)@en[[[RCDATA]]]]
- [CODE(SGML)@en[[[EMPTY]]]]
- [CODE(SGML)@en[[[ANY]]]]
]FIG]

[27] [[XML]] で利用できるのは、 [CODE(SGML)@en[[[EMPTY]]]] と
[CODE(SGML)@en[[[ANY]]]] だけです [SRC[>>122]]。

[28] [[SGML]] の[[内容モデル]]では、 [CODE(SGML)@en[[[ANY]]]]
の場合と[[モデル群]]の場合に、[[例外]]をも指定できます。それ以外の[[キーワード]]の時には、
指定できません。

;; [[例外]]を参照。

[29] [[XML]] では[[例外]]は指定できません。


[30] 非構文的制約:
-[104] [決定的内容モデル] ある要素が内容モデル中の複数の要素型の指定に該当しうる時、[[互換性のため]]、これを[[誤り]]とする。 ([[決定的内容モデル]], [[SGML]] の言葉では[[曖昧でない内容モデル]]。)
-[105] [群・引数実体が適当に入れ子になっていること] 開き括弧と閉じ括弧は同じ[[実体]]の[[置換文]]中になければなりません。 ([[妥当性制約]])
-[106] [引数実体中の群の完全性] [[相互運用性のため]]、
引数実体の置換文は1つ以上の非[[空白]]文字を含むべきです。
また、その最初及び最後の非空白文字は接続子 ([CODE(XML)[|]] / [CODE(XML)[,]])
ではないべきです。
-[31] [要素型の重複がないこと] 混合内容モデルでは、1つの要素型は1度しか出現しては行けません。 (妥当性制約)

[32] >>104 に反する例:
-[SAMP(XML)[  ( (b , c) | (b , d) )  ]] (正 [SAMP(XML)[  ( b , ( c | d ) )  ]])
- [11] [WEAK[2003-09-29 02:10:01 +00:00]] ''[[aaa]]'': aaa
[[#comment]]

[33] >>105 に反する例:
-[SAMP(XML)[ ( %model; ]]
[[#comment]]

[34] >>106 に反する例:
-[SAMP(XML)[<!ENTITY % model "   ">]]; [SAMP(XML)[ ( %model; foo ) ]]
-[SAMP(XML)[<!ENTITY % model " bar | ">]]; [SAMP(XML)[ ( %model; foo ) ]]
-[SAMP(XML)[<!ENTITY % con " | ">]]; [SAMP(XML)[ ( bar %con; foo ) ]]


[2] [[SGML]] や [[XML]] における[[内容モデル]]の分類:
[FIG(short list)[
- [[宣言内容]]
- [[要素内容]]
- [[混合内容]]
- [[空要素]]
]FIG]

[19] 
>
:[RUBYB[内容模型][content model]]:
ある[[要素型]]の[[実現値]]中で認められると宣言されたマーク構造。
[[XML 1.0]] は[[要素内容]]だけを含む ([[文字データ]]なしの)
[[要素]]と[[混合内容]] 
([[文字データ]]に加えて[[子要素]]を散在させられる[[要素]])
の2種類に分けています。後者は[[内容]]の規定が
[CODE(XML)[#[[PCDATA]]]] ([[文字データ]]を表します。)
で始まります。 [SRC[XHTML m12n Term、>>151]]

[REFS[
- [122] [CITE@EN[Extensible Markup Language (XML) 1.0 (Fifth Edition)]] ([TIME[2013-05-29 05:49:56 +09:00]] 版) <http://www.w3.org/TR/xml/#elemdecls>
- [18] [[XHTML m12n]]
--[XHTML m12n Term] [CSECTION[2. Terms and Definitions]]
<IW:XHTML1m12n:"terms.html#a_terms">
- [151] [CITE@en[XHTML™ 2.0 - Terms and Definitions]] ([TIME[2010-12-17 00:44:37 +09:00]] 版) <http://www.w3.org/TR/2010/NOTE-xhtml2-20101216/terms.html>
]REFS]


[114] ''要素字句とパラメタ実体参照 - 2003年12月 - マーク付けノート'' 
<http://www.satoshii.org/markup/notes/2003/12#date12-3>

[115] >>114 は、 
[SAMP(SGML)[<![[ENTITY]] % foo "foo"> <!ELEMENT bar (%foo;+)>]] 
のように[[出現標識]]が別の実体に分断されていてはいけないという話。

[17] >>114-115

> 直接内容モデルに [CODE[%baz.qname;+]] 
と記述すればエラーになることに注意して下さい。
> ちなみに、XML にはこの辺りの規則についての明確な記述はありません。
何らかのエラーになるのは間違いありませんが、invalid なのか 
not well-formed なのかも判然としない状態です。

という話の答えが今更ながら判った気がするので書いてみます。

> When a parameter-entity reference is recognized in the DTD 
and included, its replacement text MUST be enlarged by the 
attachment of one leading and one following space (#x20) 
character; the intent is to constrain the replacement text of 
parameter entities to contain an integral number of 
grammatical tokens in the DTD.
(XML 4.4.8 Included as PE <http://www.w3.org/TR/REC-xml/#as-PE>,
<http://www.w3.org/TR/xml11/#as-PE>)

という規定 [WEAK[(XML にだけあって SGML にはない。)]]
に従えば、 [SAMP(XML)[%baz.qname;+]]
は引数実体参照を展開すると [SAMP(XML)[baz +]] のようになります。

これは 48 番の生成規則
<http://www.w3.org/TR/REC-xml/#NT-cp> に違反します。
ですから非[[整形式]]になります。

-*-*-

[52] バリエーションのようなものとして、 [[HyTime]] は [[HyLex]] を規定していました。

** WF2

[4] [CITE@en-US[XBL 2.0]]
( ([TIME[2012-05-03 02:23:03 +09:00]] 版))
<http://dev.w3.org/2006/xbl2/Overview.html#xbl-elements>


[38] [CITE@en[Allow anything in <template> for document conformance]]
([[zcorpan]]著, [TIME[2016-07-08 03:42:26 +09:00]])
<https://github.com/whatwg/html/commit/950d3015bead974bec1d7d86c00d641655ea0b66>