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
以下のパターン
<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要素 を置いても効果はありません。つまり、以下の記述例は、全く同一の機能を有します。
- 記述例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要素
interleave要素 の子要素に1個以上の empty要素 が存在した場合、それらの empty要素 は、単に無視されます。
その 3: notAllowed要素 を含んだ interleave要素
interleave要素 の子要素に1個以上の notAllowed要素 が存在した場合、interleave要素 の内容そのものが無視され、1つの notAllowed要素 として認識されます。
上記の現象は、
- 他の記述に混じって、「不許可」というパターンも適用させなければならない。
- 元のパターン (ここでは interleave要素) そのものが「不許可」扱いされる。
- 元のパターン自体が「不許可というパターンを適用させるもの」と認識される。
と説明附けられます。
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「interleave要素 @ ぽかぽか RELAX NG 工房」