myGroup > myProject
 

choice 要素

選択肢を定義する要素

  • 子要素に記述される一聯のパターンに関し、それらのうちの一つを選ばせるために用いる要素です。
  • コンテナ や サブコンテナ (XMLなら要素属性値、要素の中身) など様々な定義の中で使うことが出来ます。
  • grammar 要素の直下には置いてはなりません。
  • スキーマのルート要素に用いることが出来ます。ただし、そのスキーマは単独では用いることは出来ず、 externalRef 要素の参照先としてのみ利用できます。

属性

  • この要素に固有な属性はありません。

子ノード

  • 複数の コンテナ もしくは サブコンテナ を子要素に持つことが出来ます。
  • interleave要素, optional要素, zeroOrMore要素 などを子に持つことも可能です。
  • 同一選択肢の中に入れるパターンは、出来るだけ同じ性質のもの(要素なら要素、属性なら属性など)を入れるのが望ましいと思われます。しかし文法がおかしくならない限りは、異種のパターンを同じ選択肢に入れることは可能です。例えば、附加情報を属性でも子要素でも現せるようにしたい場合には、要素の宣言パターンと属性の宣言パターンを同列の選択肢の中に記述する必要があります。
  • ref 要素を中身にし、マクロを参照することが出来ます。

使用例

例 1: mapping の例 (XML-XML syntax)

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)

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要素

入れ子の <span class="codefrag">choice</span>要素

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要素

<span class="codefrag">empty</span>要素 を含んだ <span class="codefrag">choice</span>要素

要素の中身の定義に関し、empty要素 と、それ以外のパターンを示す要素が同時に子要素である場合、 2個目以降の empty要素 は効果がありません。notAllowed要素 の場合と違い、「空の記述 = 何も書かない状態」も許されることに注意してください(つまり、選択肢がオプション扱いされる)。

その 3: notAllowed要素 を含んだ choice要素

<span class="codefrag">notAllowed</span>要素 を含んだ <span class="codefrag">choice</span>要素

notAllowed要素 と、それ以外のパターンを示す要素が同時に子要素である場合、notAllowed要素 が書かれていないことと変わりません。

このことは、モジュールを設計する際に役に立ちます。例えば、デフォルトでは「記述不可能」としておき、モジュールを結合させることで選択肢を設置もしくは増やす、といったことが出来ます。

参考文献