attribute
要素の親要素として用いることで、属性をオプション扱いとして定義出来ます(DTD では #IMPLIED の宣言に相当)。attribute
要素の子孫要素としては用いることが出来ません。grammar
要素の直下には置いてはなりません。optional
要素をルート要素とすることが出来ます。ただし、そのスキーマは単独では用いることは出来ず、 externalRef
要素の参照先としてのみ利用できます。連続する optional
要素の中身を、一つの optional
要素の中身としてまとめることは出来ません。以下に、その例を示します。
<optional> <ref name="a"/> </optional> <optional> <ref name="b"/> </optional>
<optional> <ref name="a"/> <ref name="b"/> </optional>
例1では、「aとbそれぞれが任意出現パターン」であるのに対し、例2では、「aとbとの並びが任意出現」となります。それぞれのパターンを任意出現パターンとして定義したい場合は、面倒でも独立した optional
要素の子要素として記述しなければなりません。
choice
, interleave
各要素の子要素でない場合、定義の出現順番は保持されます。例えば、以下のスキーマを考えます。
<element name="p"> <optional> <element name="a"><empty/></element> </optional> <optional> <element name="b"><empty/></element> </optional> </element>
上記のスキーマに則った場合、以下の文書は妥当とはなりません。
<p><b/><a/></p>
つまり「オプション扱い」になると言っても、順序まで任意になるわけではないので、注意してください(順序を任意にしたい場合は、 choice
, interleave
各要素の子要素とする必要があります)。