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 }?
  }*
}