grammar 要素の直下には置いてはなりません。choice 要素をルート要素とすることが出来ます。ただし、そのスキーマは単独では用いることは出来ず、 externalRef 要素の参照先としてのみ利用できます。interleave, optional, zeroOrMore などとの併用も可能です。ref 要素を中身に記述し、マクロを参照することが出来ます。choice 要素の中の choice 要素の中身は、 choice 要素が無いものとして扱われます。つまり、以下の記述例は、全く同一の機能を有します。
<choice> <ref name="a"/> <choice> <ref name="b"/> <ref name="c"/> </choice> </choice>
<choice> <ref name="a"/> <ref name="b"/> <ref name="c"/> </choice>
notAllowed 要素と、それ以外のパターンを示す要素が同時に子要素である場合、 0個以上のnotAllowed 要素は無視されます。あってもなくても、選択には何ら影響を有しません。
この機能は、モジュールを設計する際に役に立ちます。例えば、デフォルトでは「記述不可能」としておき、モジュールを結合させることで選択肢を設置もしくは増やす、といったことが出来ます。
要素の中身の定義に関し、 empty 要素と、それ以外のパターンを示す要素が同時に子要素である場合、 2個以上の empty 要素は無視されます。ただし、 notAllowed 要素の場合と違い、「空の記述 = 何も書かない状態」も許されることに注意してください(つまり、選択肢がオプション扱いされる)。