attribute 要素
要素の属性を定義する要素
- lang や space の属性を定義する場合、名前空間を考慮する必要はありません。
- 複数の attribute要素 を用いることで、一つの要素に複数の属性を定義出来ます。その際、element要素 要素と異なり、 実際の属性の出現順位は、attribute要素 の出現順位に依存しません。つまり、定義さえされていれば、実際には任意の順番で属性を記述出来る、ということです。
- element要素 直下に記述された場合、その属性は必須属性となります(DTD では、 #REQUIRED の宣言に相当)。任意属性 (DTD で言う #IMPLIED) としたい場合は、optional要素 の中に attribute要素 を入れる必要があります。
- oneOrMore要素, zeroOrMore要素 を親要素とすることは可能ですが、同じ属性名を持つ属性を複数書けるようにはなりません。optional要素 は普通に使用出来ます。
属性
name 属性
- 属性名を定義します。element要素 と同様、このほかに name要素 で定義、もしくは anyName要素 を子要素とすることで、任意の名前の属性を入れられるように定義することも可能です。ここで定義される名前は「有修飾名(qualified name)」なので、名前空間を考慮する必要があります。
ns,xmlns:xxxx 属性
- grammar要素, element要素 と同様、ns 属性 や xmlns:xxxx 属性 を用いて、局所的に名前空間を変更することが出来ます。
- 要素に名前空間を指定したとしても、通例属性はローカルなままで用います。この場合 xmlns:xxxx 属性 を、attribute要素 で定義する必要はありません。
子ノード
- 子ノードにより、その属性の属性値が定義されます。
- text要素 を用いるのが一般的ですが、value要素, data要素 や choice要素 を子孫に持つことが出来ます。
- element要素, attribute要素 を子孫要素としてはなりません。
- 当然ですが、ref要素 を子孫要素とする場合、その参照先に、上記の禁じられた要素が存在してはなりません。
- ref 要素を中身にし、マクロを参照することが出来ます。
使用例
例 1:
item 要素において、 lang 属性と、xlink:href 属性を定義。 lang 属性は任意、 xlink:href 属性は必須とする。いずれも属性値は任意テキストとする。
<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>
例 2:
color 属性を定義。属性値は、 red, blue, yellow いずれかの値を取り得る。
<attribute name="color"> <choice> <value>red</value> <value>blue</value> <value>yellow</value> </choice> </attribute>
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「attribute要素 @ ぽかぽか RELAX NG 工房」