[8] [CODE(math)[[DFN[[RUBYB[属性並び宣言][Attribute list declaration]]]] = [DFN[[RUBYB[[[属性定義並び宣言]]][attribute definition list declaration]]]]]]は、
ある[[要素型]]に存在する[[属性]]とその型・既定値を[[宣言]]するのに使う、
[[文書型宣言]]中の[[マーク宣言]]です。

>
:属性 (定義) 並び宣言 [attribute (definition) list declaration] :
属性 (定義) 並びを一つ以上の[[要素型]]と結合するマーク宣言。 [INS[[[JIS X 4151]]‐1992 3. (144)]]

[9] XML: <http://www.w3.org/TR/REC-xml#attdecls>

[10] XML では、一つの要素型に対して複数の属性並び宣言を書けます。
しかし、[[相互運用性のため]]、文書型定義を通して
- 一つの要素型に対して高々1個の属性並び宣言を書くべきです。
- あるの要素型の一つの属性について、高々1個の宣言を書くべきです。
- 一つの属性並び宣言では最低1個の属性を宣言するべきです。

[11] [CODE(SGML)[attr (foo|bar) #[[FIXED]] foo]] 
は構文的に妥当だけど意味がない。 
([[モジュール化]]とかしてると便利なこともあるかもしれない。)

[DEL[
[12] [[妥当]]であるためには、属性並び宣言中の名前 ([[要素型名]]) 
が[[要素型宣言]]で宣言されている必要があります。
]DEL]

[13] >>12 XML を良く読んでみたら、そんな妥当性制約はないや。。。
属性並び宣言の要素型名って要素型宣言とは違ってどうでもいいんだ。。。

[14] この宣言は、[[文書型定義]]中の前の部分でも後の部分でも構いません。 
(と思います。特に制約する規定はないはずです。)

* 属性定義並び宣言 (SGML)

[1] = [[属性並び宣言]]。 Attribute definition list declaration。

- [2] [CODE(ABNF)[[DFN[属性定義並び宣言]] := [CODE(SGML)[[[mdo]]]] [[ATTLIST]] 1*[[ps]] 関連付けられる対象 1*ps [[属性定義並び]] 1*ps [CODE(SGML)[[[mdc]]]] ;; [[JIS X 4151]]‐1992 (141), [[WebSGML]] [141] ]]
- [5]
[PRE[
[CODE(ABNF)[[DFN[関連付けられる対象]]]]
  := 
    ;; 要素型についての属性定義並び宣言
      [[関連付けられる要素型]]
    / [CODE(SGML)[[[rni]]]] [[IMPLICIT]]
    / [CODE(SGML)[rni]] [[ALL]]
    ;; 記法についての属性定義並び宣言
    / [CODE(SGML)[rni]] [[NOTATION]] 1*ps
      (
        [[記法名]] / [[名前群]]
      / [CODE(SGML)[rni]] IMPLICIT
      / [CODE(SGML)[rni]] ALL
      )
]PRE]
-- [CODE(SGML)[IMPLICIT]] は、暗黙に宣言された[[要素型]]又は[[記法]]及びその [[DTD特性]]が [[DTDデータ実体]]中で表現されるものを意味します。
-- [CODE(SGML)[ALL]] は、全ての要素型又は記法を意味します。

[3] 素の SGML では、関連付けられる要素型は同じ[[文書型定義]]中の他の属性定義並び宣言で使われていてはなりません。 (10.3 参照。) [[WebSGML]] では、この制限が撤廃されています。
同じ属性についての[[属性定義]]が複数あれば、最初のものが採用されます。
(K.4.4 参照。)

[CODE(SGML)[ALL]] の定義は、名前又は [CODE(SGML)[IMPLICIT]] を指定した定義により上書きされます。ですから例えば、
[PRE[
<!ATTLIST #ALL foo CDATA #IMPLIED>
<!ATTLIST bar  foo CDATA #REQUIRED>
]PRE]

なら [CODE(SGML)[bar]] 要素の [CODE(SGML)[foo]] 属性は必須です。

しかしながら、 [CODE(SGML)[ALL]] で宣言された[[データ属性]]を指定した後にその属性を再宣言することは、
Web SGML でも[[誤り]]です。例えば、
[PRE[
<!ATTLIST #NOTATION #ALL foo CDATA #IMPLIED>
<!NOTATION somenotation SYSTEM [foo=bar]>
<!ATTLIST #NOTATION somenotation foo CDATA #IMPLIED>
]PRE]

は3行目で誤りとなります。

[[#comment]]

* 属性定義並び宣言 (AFDR DTD)

[6]
[[ISO/IEC 10744]]:1997 の[[体系DTD]] で使用する、
[[属性形式]]や[[データ属性形式]]を定義する属性定義並び宣言でも、 
Web SGML と同じような拡張が使えます。
[WEAK[(その場合 (素の) SGML DTD ではなくなるので、 [CODE(SGML)[[[AFDR]]]] 宣言が必要です。)]]

- 同じ要素型に関連付けられた属性定義並び宣言が複数あってもよい。
- 要素型が予約名 [CODE(SGML)[#[[ALL]]]] なら、そこで定義された属性はその[[体系]]のすべての[[要素形式]]で使える ([DFN[[[共通属性]]]])。
- 同じ要素型で同じ名前の属性定義が複数あれば、二つ目以降は無効。共通属性宣言は他の属性定義並び宣言の後にあるものとみなす。
- [[記法形式]]に関連付けられる[[データ属性形式]]の宣言についても同様である。

仕様書: ISO/IEC 10744:1997 A.3.2.2
<http://www.y12.doe.gov/sgml/wg8/docs/n1920/html/clause-A.3.2.html#clause-A.3.2.2>

[7]
SGML は属性名がすべて固有であることを要求していますから、
設計者は共通属性名が他のすべてと異なるように注意するべきです。
(NOTE 404)

(そうしないと[[派生体系]]の側で上書きされれてしまった共通の属性形式が使えなくなってしまいます。)


[[#comment]]


* 暗黙の属性定義並び宣言 (Web SGML)

[4] Web SGML で導入された
[CODE(SGML)[[[IMPLYDEF]] ATTLIST YES]]
の状態では、[[文書型宣言]]で属性定義並び宣言を明示しなくても属性が使えます。

宣言されていない属性が実現値に出現したら、
その属性は [CODE(SGML)[[[CDATA]] #[[IMPLIED]]]]
として宣言されていたものとみなします。
(Web SGML K.3.7 b)1) 参照。)

[[#comment]]

* メモ