choice 要素
選択肢を定義する要素
- 子要素に記述される一聯のパターンに関し、それらのうちの一つを選ばせるために用いる要素です。
- コンテナ や サブコンテナ (XMLなら要素属性値、要素の中身) など様々な定義の中で使うことが出来ます。
- grammar 要素の直下には置いてはなりません。
- スキーマのルート要素に用いることが出来ます。ただし、そのスキーマは単独では用いることは出来ず、 externalRef 要素の参照先としてのみ利用できます。
属性
- この要素に固有な属性はありません。
子ノード
- 複数の コンテナ もしくは サブコンテナ を子要素に持つことが出来ます。
- interleave要素, optional要素, zeroOrMore要素 などを子に持つことも可能です。
- 同一選択肢の中に入れるパターンは、出来るだけ同じ性質のもの(要素なら要素、属性なら属性など)を入れるのが望ましいと思われます。しかし文法がおかしくならない限りは、異種のパターンを同じ選択肢に入れることは可能です。例えば、附加情報を属性でも子要素でも現せるようにしたい場合には、要素の宣言パターンと属性の宣言パターンを同列の選択肢の中に記述する必要があります。
- ref 要素を中身にし、マクロを参照することが出来ます。
使用例
例 1: mapping の例 (XML-XML syntax)
以下のパターンは、'A' もしくは '2' にマッチします。 プログラミング言語では、これらをそれぞれ 変数 id の値 '1'、'2'に、対応させています。
-
<choice> <group> <dat:byte><dat:value>A</dat:value></dat:byte> <lang:value-of select="id"><lang:value>1</lang:value></lang:value-of> </group> <group> <dat:byte> <lang:value-of select="id"><value>2</value></lang:value-of> </dat:byte> </group> </choice>
例 2: mapping の例 (XML-language syntax)
例 1 は、以下のように書き直すことができます。 しかし、記述方法については、まだ決定していません。
- encode の例
-
<choice> <group> <lang:value>1</lang:value> = id; <dat:byte><dat:value>A</dat:value></dat:byte> </group> <group> <dat:byte> <value>2</value> = id; </dat:byte> </group> </choice>
- decode の例
-
<choice> <group> <dat:byte><dat:value>A</dat:value></dat:byte> id = <lang:value>1</lang:value>; </group> <group> <dat:byte> id = <value>2</value>; </dat:byte> </group> </choice>
choice 直下の group の中に、 通常はその他のデータ定義が含まれます。 処理系に実装されたアルゴリズムは 全ての文法を取り扱えるとは限りません。 固定のための識別パターンは、 先頭で定義することが好まれます。
考えてみよう!
その 1: 入れ子の choice要素
choice要素 直下に choice要素 を置いても効果はありません。つまり、以下の記述例は、全く同一の機能を有します。
- 記述例1
-
<choice> <ref name="a"/> <choice> <ref name="b"/> <ref name="c"/> </choice> </choice>
- 記述例2
-
<choice> <ref name="a"/> <ref name="b"/> <ref name="c"/> </choice>
その 2: empty要素 を含んだ choice要素
要素の中身の定義に関し、empty要素 と、それ以外のパターンを示す要素が同時に子要素である場合、 2個目以降の empty要素 は効果がありません。notAllowed要素 の場合と違い、「空の記述 = 何も書かない状態」も許されることに注意してください(つまり、選択肢がオプション扱いされる)。
その 3: notAllowed要素 を含んだ choice要素
notAllowed要素 と、それ以外のパターンを示す要素が同時に子要素である場合、notAllowed要素 が書かれていないことと変わりません。
このことは、モジュールを設計する際に役に立ちます。例えば、デフォルトでは「記述不可能」としておき、モジュールを結合させることで選択肢を設置もしくは増やす、といったことが出来ます。
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「choice要素 @ ぽかぽか RELAX NG 工房」