RELAX NG Compact Syntax Tutotial を読む(3)
"RELAX NG Compact Syntax Tutotial" をだらだら読んでいくコーナー。次は "3. Attributes"「属性」です。
次のように名前やアドレスを、要素の内容ではなく、属性で書く場合。
<addressBook> <card name="山田太郎" email="taro@example.com"/> <card name="山田花子" email="hanako@example.com"/> </addressBook>
card 要素は内容が空で、必須の name 属性と email 属性を持つ。これを DTD で書くと次のようになる。「内容が空」は「EMPTY」、属性は ATTLIST で。
<!DOCTYPE addressBook [ <!ELEMENT addressBook (card*)> <!ELEMENT card EMPTY> <!ATTLIST card name CDATA #REQUIRED email CDATA #REQUIRED> ]>
これを RELAX NG Compact Syntax で書くと、
element addressBook { element card { attribute name { text }, attribute email { text } }* }
要素と同じような書き方でいける。
属性の順序云々のところは当たり前すぎるので読み飛ばして。
属性が必須じゃない場合(省略可能な場合)は、"?"
をつける。
element addressBook { element card { attribute name { text }, attribute email { text }, attribute note { text }? }* }
","
や "|"
も要素のときと同じように使える。
要素が属性を持つけど内容(子要素やテキスト)を持たない場合は、"empty"
で明示できる。
element addressBook { element card { attribute name { text }, attribute email { text }, empty }* }
この場合の "empty"
はあってもなくても一緒。次のように、要素が「子も属性も持たない」場合は "empty"
が必要。
element addressBook { element card { element name { text }, element email { text }, element prefersHTML { empty }? }* }