attribute 要素の中身により、その属性の属性値が定義されます。element 要素と同様、 name 属性もしくは name 要素で定義します。また、 anyName を子要素とすることで、任意の名前の属性を入れられるようにすることも可能です。ここで定義される名前は「有修飾名(qualified name)」なので、名前空間を考慮する必要があります。text 要素を用いるのが一般的ですが、 value, data 要素や、 choice 要素や ref 要素を子孫に持つことが出来ます。element, attribute 要素を子孫要素としてはなりません。oneOrMore, zeroOrMore 要素を親要素とすることは可能ですが、同じ属性名を持つ属性を複数書けるようにはなりません。 optional 要素は普通に使用出来ます。ref 要素を子孫要素とする場合、その参照先に、上記の禁じられた要素が存在してはなりません。attribute 要素を用いることで、一つの要素に複数の属性を定義出来ます。その際、 element 要素と異なり、 実際の属性の出現順位は、 attribute 要素の出現順位に依存しません。つまり、定義さえされていれば、実際には任意の順番で属性を記述出来る、ということです。element 要素直下に記述された場合、その属性は必須属性となります(DTD では、 #REQUIRED の宣言に相当)。任意属性 (DTD で言う #IMPLIED) としたい場合は、 optional 要素の中に attribute 要素を入れる必要があります。grammar, element 要素と同様、 ns 属性や xmlns:xxxx 属性を用いて、局所的に名前空間を変更することが出来ます。
lang や space の属性を定義する場合、名前空間を考慮する必要はありません。xmlns:xxxx 属性は、 attribute 要素で定義する必要はありません。
<element name="p">
<optional>
<attribute name="lang">
<text/>
</attribute>
</optional>
<attribute name="xlink:href" xmlns:xlink="http://www.w3.org/1999/xlink">
<text/>
</attribute>
<text/> <!-- p要素の中身はテキストとする -->
</element>
<attribute name="color"> <choice> <value>red</value> <value>blue</value> <value>yellow</value> </choice> </attribute>