[14] 
[DFN[[RUBYB[要素(型)宣言]@en[element (type) declaration]]]]は、
[[要素型]]を[[宣言]]する[[マーク付け宣言]]でした。

[15] 
[[要素型宣言]]は、
[[要素型]]の定義、すなわち[[共通識別子]]、
[[開始タグ]]と[[終了タグ]]の省略の可否、
[[内容モデル]]を記述できるものでした。

[16] 
[[素のSGML]]では、
[[要素型宣言]]は [[SGML文書]]の必須の構成要素でした。
[[宣言]]されていない[[要素型]]の利用は禁止されており、
[[非妥当]]でした。

[17] 
[[Web SGML]] では、[[SGML宣言]]の指定により、
[[宣言]]されていない[[要素型]]の利用が解禁されました。

[18] 
[[XML]] では[[文書]]が[[整形式]]であるためには[[要素型]]が[[宣言]]されることは必須ではなく、
[[妥当]]であるためには[[宣言]]しなければならないとされました。

* 定義

[12]
>
:(290) 要素宣言 (element declaration):
[[内容]]及び[[マーク最小化機構]]を処理する要素型宣言の形式指定からなる[[マーク宣言]]。
[SRC[[[JIS X 4151]]-1992 3.]]

[Q[要素型宣言]]は[Q[[[要素型定義]]]]の誤り?
それとも素の SGML では[Q[要素型宣言]] (未定義語)
の一種が[Q[要素宣言]]だったのでしょうか?

[13] '''構文''':
- [1] [CODE(ABNF)[[DFN[要素型宣言]] := [CODE(SGML)[[[mdo]]]] [[ELEMENT]] 1*[[ps]] [[要素型]] [1*ps タグ省略最小化] 1*ps ([[宣言内容]] / [[内容モデル]]) *ps [CODE(SGML)[[[mdc]]]] ;; JIS X 4151‐1992 (116)]]
- [2] [CODE(ABNF)[[DFN[タグ省略最小化]] := 最小化 1*ps 最小化 ;; (122)]] タグ省略最小化引数を指定できるのは、 [CODE(SGML)[[[OMITTAG]] NO]] のときだけ。
- [3] [CODE(SGML)[[DFN[最小化]] := [[O]] / [CODE(SGML)[minus]] ;; (123), (124)]] 一つ目は開始タグ、二つ目は終了タグの指定。
- [4] [CODE(ABNF)[[DFN[要素型]] := [[共通識別子]] / [[名前群]] / [[付番要素]] / [[付番群]] ;; (117)]] 付番核に[[付番]]を付けて得られるものも含めて、共通識別子は[[文書型定義]]内で固有でなければならない。 (10.2.1)

[[#comment]]

* 暗黙の要素型宣言

[5] [[WebSGML]] で [[SGML宣言]]の [CODE(SGML)[[[IMPLYDEF]]]] 引数において
[CODE(SGML)[[[ELEMENT]] NO]] 以外の値が指定されていると、
要素型宣言を明示しなくてもよいことになります。

[6] 例えば、 [SAMP(SGML)[foo]] 要素が[[文書実現値]]で使われているものの、
[[DTD]] で宣言されていないとします。
このとき、 [SAMP(SGML)[<!ELEMENT foo - o [[ANY]]>]]
という宣言がなされていたものと仮定されます。

[CODE(SGML)[ELEMENT YES]] ではなく
[CODE(SGML)[ELEMENT ANYOTHER]] であった場合には、
更に[[直接再帰要素]]の禁止という制限が加わります。
[WEAK[(この制限は DTD では表現できません。これを表現可能な [[DTD記法]]を使わない場合には、 [CODE(SGML)[ANYOTHER]] 以外に実現方法はありません。)]]

直接再帰要素が禁止されていると、例えば、
[PRE(SGML)[
<foo><bar><foo/></bar></foo>
]PRE]
は妥当ですが、
[PRE(SGML)[
<foo><foo/></foo>
]PRE]
は不当です。

[7] [CODE(SGML)[ANYOTHER]] が有用なのは 
[CODE(SGML)[[[OMITTAG]] YES]] のときです。
このとき[[終了タグ]]が省略できるので、
[PRE(SGML)[
<list>
<item>Something
<item>Something
<item>Something
</list>
]PRE]
を (暗示宣言だけで!) 実現できます。
[WEAK[([[充足タグ付き文書実現値]]になっています。)]]

[[#comment]]

* 要素型形式の宣言

[8] 要素型宣言は、[[体系DTD]] では要素(型)形式の宣言となります。

仕様書: [[ISO/IEC 10744]]:1997 A.3.2.1.1
<http://www.y12.doe.gov/sgml/wg8/docs/n1920/html/clause-A.3.2.html#clause-A.3.2.1.1>

文書実現値の要素ではなく、
[[体系文書実現値]]の[[体系要素]]を通じて間接的に文書実現値の要素を制約するという違いはありますが、
大体においては[[応用DTD]] の要素型宣言と同じ意味を持ちます。

[9] 取込み[[例外]] ([SAMP(SGML)[+(foo|bar)]] のようなもの)
は、応用 DTD の宣言では、[[記録終了]]の扱いに影響するとか、
意味的解釈に影響するとかがありますが、応用 DTD
ではこれはありません。[[模型群]]に普通に書かれていた場合と同じ意味になります。
(応用 DTD の著者は応用 DTD でも同じように取込み例外として定義しても構いませんし、
模型群に組込んでも構いません。応用 DTD 
で例外として定義した場合は当然記録終了などに影響します。)

省略タグ最小化引数 ([SAMP(SGML)[- o]] のようなもの)
は、応用 DTD で採用しても構いませんし、しなくても構いません
(つまり応用文書には影響しません)。
ただし、[[体系文書]]で体系要素を認識するときには影響します。

[10]
体系要素の[[内容]]の意味については SGML の要素型宣言では記述できませんから、
[[体系定義文書]]で記述します。そこで特に規定があれば、
体系要素の内容はそれに従って解釈されます。そうでなければ、
それぞれの体系要素の元々の意味で解釈します。

(たとえば、体系文書で [SAMP(SGML)[<a><b/></a>]] となっているときに、
体系定義文書で [SAMP[a]] の子供である [SAMP[b]] について何か記述があれば、 
[SAMP[b]] は [SAMP[a]] の子供 [SAMP[b]] としての意味を持ちますが、
記述が無ければ、 [SAMP[a]] とは関係無しの [SAMP[b]] としての意味を持ちます。
当たり前と言えば当たり前。)

[11]
[[派生体系]]の[[内容模型]]は、
[[基底体系]]の[[体系内容模型]]に一対一対応する必要は無く、
要素形式について部分集合になっていれば OK です。

たとえば、体系内容模型が [SAMP(SGML)[(a | b | c)*]]
のとき、内容模型は [SAMP(SGML)[(a | b)*]] でも [SAMP(SGML)[(a | b | c)+]]
でも構いません。 (しかし [SAMP(SGML)[(a | b | c | d)*]] だと 
[ABBR[[[RAE]]][報告可能マーク誤り]] です。) また、
[[非体系的]]な要素型を加えても影響は無いので、 
[SAMP(SGML)[(a | b | c | x)*]] や [SAMP(SGML)[((a | b)+, (c | x))]] 
でも構いません。

[[#comment]]

* メモ