!ATTLIST

!ATTLIST

[8] 属性並び宣言 (Attribute list declaration) = 属性定義並び宣言 (attribute definition list declaration) は、 ある要素型に存在する属性とその型・既定値を宣言するのに使う、 文書型宣言中のマーク宣言です。

属性 (定義) 並び宣言 [attribute (definition) list declaration]
属性 (定義) 並びを一つ以上の要素型と結合するマーク宣言。 JIS X 4151‐1992 3. (144)

[9] XML: <http://www.w3.org/TR/REC-xml#attdecls>

[10] XML では、一つの要素型に対して複数の属性並び宣言を書けます。 しかし、相互運用性のため、文書型定義を通して

[11] attr (foo|bar) #FIXED foo は構文的に妥当だけど意味がない。 (モジュール化とかしてると便利なこともあるかもしれない。)

[12] 妥当であるためには、属性並び宣言中の名前 (要素型名) が要素型宣言で宣言されている必要があります。

[13] >>12 XML を良く読んでみたら、そんな妥当性制約はないや。。。 属性並び宣言の要素型名って要素型宣言とは違ってどうでもいいんだ。。。

[14] この宣言は、文書型定義中の前の部分でも後の部分でも構いません。 (と思います。特に制約する規定はないはずです。)

属性定義並び宣言 (SGML)

[1] = 属性並び宣言。 Attribute definition list declaration。

[3] 素の SGML では、関連付けられる要素型は同じ文書型定義中の他の属性定義並び宣言で使われていてはなりません。 (10.3 参照。) WebSGML では、この制限が撤廃されています。 同じ属性についての属性定義が複数あれば、最初のものが採用されます。 (K.4.4 参照。)

ALL の定義は、名前又は IMPLICIT を指定した定義により上書きされます。ですから例えば、

<!ATTLIST #ALL foo CDATA #IMPLIED>
<!ATTLIST bar  foo CDATA #REQUIRED>

なら bar 要素の foo 属性は必須です。

しかしながら、 ALL で宣言されたデータ属性を指定した後にその属性を再宣言することは、 Web SGML でも誤りです。例えば、

<!ATTLIST #NOTATION #ALL foo CDATA #IMPLIED>
<!NOTATION somenotation SYSTEM [foo=bar]>
<!ATTLIST #NOTATION somenotation foo CDATA #IMPLIED>

は3行目で誤りとなります。

属性定義並び宣言 (AFDR DTD)

[6] ISO/IEC 10744:1997 の体系DTD で使用する、 属性形式データ属性形式を定義する属性定義並び宣言でも、 Web SGML と同じような拡張が使えます。 (その場合 (素の) SGML DTD ではなくなるので、 AFDR 宣言が必要です。)

仕様書: 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)

(そうしないと派生体系の側で上書きされれてしまった共通の属性形式が使えなくなってしまいます。)

暗黙の属性定義並び宣言 (Web SGML)

[4] Web SGML で導入された IMPLYDEF ATTLIST YES の状態では、文書型宣言で属性定義並び宣言を明示しなくても属性が使えます。

宣言されていない属性が実現値に出現したら、 その属性は CDATA #IMPLIED として宣言されていたものとみなします。 (Web SGML K.3.7 b)1) 参照。)

メモ