myGroup > myProject
 

interleave 要素

順位不同の必須パターンを定義する要素

  • 子要素に記述される一聯のパターンに関し、順位不同で必須の記述であることを示す要素です。group要素 が「順位を保持したグループ化」であるのに対し、interleave要素 は「順不同のグループ化」を明示する要素であると言えます。
  • XML文書の属性の出現順位はもともと順位不同なので、attribute要素 の親要素として使用しても意味がありません。ただし、モジュールを用いて属性を増やしたい場合には、この要素の利用価値があるかと思われます。
  • コンテナ や サブコンテナ (XMLなら要素属性値、要素の中身) など様々な定義の中で使うことが出来ます。
  • grammar 要素の直下には置いてはなりません。
  • スキーマのルート要素に用いることが出来ます。ただし、そのスキーマは単独では用いることは出来ず、 externalRef 要素の参照先としてのみ利用できます。

属性

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

制約

interleave の直下に指定できる子要素の数は、最大「32」です。

子ノード

  • 複数の コンテナ もしくは サブコンテナ を子要素に持つことが出来ます。
  • choice要素, optional要素, zeroOrMore要素 などを子に持つことも可能です。
  • interleave要素 でグループ化すべきパターンが同一である (要素なら要素、属性なら属性など) 方が理解しやすいですが、必ずしもそのようにしなければならない決まりはありません。
  • ref 要素を中身にし、マクロを参照することが出来ます。

使用例

例 1:

例えば、以下のようなスキーマの記述があったとします。

<element name="doc">
 <interleave>
  <element name="a"><empty/></element>
  <element name="b"><empty/></element>
  <element name="c"><empty/></element>
 </interleave>
</element>

上記のスキーマに照らし合わせれば、以下の記述はいずれも妥当なものとなります。

  • <doc><a/><b/><c/></doc>
  • <doc><a/><c/><b/></doc>
  • <doc><b/><a/><c/></doc>
  • <doc><b/><c/><a/></doc>
  • <doc><c/><a/><b/></doc>
  • <doc><c/><b/><a/></doc>

例 2: group の interleave

group の interleave

以下のパターン

<interleave>
  <group>
    <element name="a"><text/></element>
    <element name="b"><text/></element>
  </group>
  <element name="c"><text/></element>
</interleave>

は、以下にマッチします。

  • <a/><b/><c/>
  • <a/><c/><b/>
  • <c/><a/><b/>

考えてみよう!

その 1: 入れ子の interleave 要素

入れ子の interleave 要素

interleave要素 直下に interleave要素 を置いても効果はありません。つまり、以下の記述例は、全く同一の機能を有します。

記述例1
<interleave>
 <ref name="a"/>
 <interleave>
  <ref name="b"/>
  <ref name="c"/>
 </interleave>
</interleave>
記述例2
<interleave>
 <ref name="a"/>
 <ref name="b"/>
 <ref name="c"/>
</interleave>

その 2: empty要素 を含んだ interleave要素

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

interleave要素 の子要素に1個以上の empty要素 が存在した場合、それらの empty要素 は、単に無視されます。

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

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

interleave要素 の子要素に1個以上の notAllowed要素 が存在した場合、interleave要素 の内容そのものが無視され、1つの notAllowed要素 として認識されます。

上記の現象は、

  1. 他の記述に混じって、「不許可」というパターンも適用させなければならない。
  2. 元のパターン (ここでは interleave要素) そのものが「不許可」扱いされる。
  3. 元のパターン自体が「不許可というパターンを適用させるもの」と認識される。

と説明附けられます。

参考文献