[8] 属性並び宣言 = 属性定義並び宣言
は、
ある要素型に存在する属性とその型・既定値を宣言するのに使う、
文書型宣言中のマーク宣言です。
- 属性 (定義) 並び宣言 [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
は構文的に妥当だけど意味がない。
(モジュール化とかしてると便利なこともあるかもしれない。)
[13] >>12 XML を良く読んでみたら、そんな妥当性制約はないや。。。 属性並び宣言の要素型名って要素型宣言とは違ってどうでもいいんだ。。。
[14] この宣言は、文書型定義中の前の部分でも後の部分でも構いません。 (と思います。特に制約する規定はないはずです。)
[1] = 属性並び宣言。 Attribute definition list declaration。
属性定義並び宣言 := mdo
ATTLIST 1*ps 関連付けられる対象 1*ps 属性定義並び 1*ps mdc
;; JIS X 4151‐1992 (141), WebSGML [141]
関連付けられる対象
:= ;; 要素型についての属性定義並び宣言 関連付けられる要素型 /rni
IMPLICIT /rni
ALL ;; 記法についての属性定義並び宣言 /rni
NOTATION 1*ps ( 記法名 / 名前群 /rni
IMPLICIT /rni
ALL )
[3] 素の SGML では、関連付けられる要素型は同じ文書型定義中の他の属性定義並び宣言で使われていてはなりません。 (10.3 参照。) WebSGML では、この制限が撤廃されています。 同じ属性についての属性定義が複数あれば、最初のものが採用されます。 (K.4.4 参照。)
ALL
の定義は、名前又は IMPLICIT
を指定した定義により上書きされます。ですから例えば、
<!ATTLIST #ALL foo CDATA #IMPLIED> <!ATTLIST bar foo CDATA #REQUIRED>
しかしながら、 ALL
で宣言されたデータ属性を指定した後にその属性を再宣言することは、
Web SGML でも誤りです。例えば、
<!ATTLIST #NOTATION #ALL foo CDATA #IMPLIED> <!NOTATION somenotation SYSTEM [foo=bar]> <!ATTLIST #NOTATION somenotation foo CDATA #IMPLIED>
は3行目で誤りとなります。
[6]
ISO/IEC 10744:1997 の体系DTD で使用する、
属性形式やデータ属性形式を定義する属性定義並び宣言でも、
Web SGML と同じような拡張が使えます。
(その場合 (素の) SGML DTD ではなくなるので、 AFDR
宣言が必要です。)
#ALL
なら、そこで定義された属性はその体系のすべての要素形式で使える (共通属性)。仕様書: 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)
(そうしないと派生体系の側で上書きされれてしまった共通の属性形式が使えなくなってしまいます。)
[4] Web SGML で導入された
IMPLYDEF ATTLIST YES
の状態では、文書型宣言で属性定義並び宣言を明示しなくても属性が使えます。
宣言されていない属性が実現値に出現したら、
その属性は CDATA #IMPLIED
として宣言されていたものとみなします。
(Web SGML K.3.7 b)1) 参照。)