zeroOrMore 要素
0回以上の繰り返しを定義する要素
- 子要素に記述される一聯のパターンに関し、それらのパターンが任意の回数(0回含む)繰り返して出現することを指示する要素です。
- XML では、主に要素の中身の定義に対して用います。
- attribute要素 の直截の親要素として用いた場合、その属性はオプション属性と見倣されます (optional要素 の子要素として記述した場合と同じ)。同名の属性を複数記述出来るようになるわけではありませんので、注意してください。
- attribute要素 の子孫要素としては用いることが出来ません。
- grammar 要素の直下には置いてはなりません。
- スキーマのルート要素に用いることが出来ます。ただし、そのスキーマは単独では用いることは出来ず、 externalRef 要素の参照先としてのみ利用できます。
- 要素名に大文字が混じっていますので、記述には注意してください。
属性
lang:occurs 属性
名前空間 lang に属する属性です。繰り返し処理の回数を、事前に設定してください。
- decode : 指定された回数だけ、繰り返し処理を実行します。
- encode : 指定された回数だけ、繰り返し処理を実行します(encode 時は必須です)。
lang:occured 属性
名前空間 lang に属する属性です。zeroOrMore の処理の後に設定されます。
- decode : 繰り返し数の解析結果が、指定された変数に代入されます。
- encode : 指定できません。
制約
- optional、oneOrMore、zeroOrMore を入れ子にできる最大数は、「32」です。
- ref 要素を中身にし、マクロを参照することが出来ます。 ただし、ソースコードの生成前に、define/ref が展開されている必要があります。
- lang:occurs 属性と、lang:occured 属性を同時に指定することはできません。 どちらか一方を必ず指定してください。
- lang:occurs 属性に 0 未満の値を指定することはできません。エラーとなります。
子ノード
- 複数の コンテナ もしくは サブコンテナ を子要素に持つことが出来ます。 interleave要素, optional要素, zeroOrMore要素 などを子に持つことも可能です。
考えてみよう!
その 1: 連続する zeroOrMore要素
連続する zeroOrMore要素 の中身を、一つの zeroOrMore要素 の中身としてまとめることは出来ません。以下に、その例を示します。
- 例1
-
<zeroOrMore> <ref name="a"/> </zeroOrMore> <zeroOrMore> <ref name="b"/> </zeroOrMore>
- 例2
-
<zeroOrMore> <ref name="a"/> <ref name="b"/> </zeroOrMore>
例1では、「aが1回以上出現した後、bが0回以上出現するパターン (aa…bb…)」であるのに対し、例2では、「aとbが、この順番を保持したまま0回以上出現 (abab…)」となります。
その 2: 出現順番に関して
- choice要素, interleave要素 の子要素でない場合、定義の出現順位は保持されます。
- zeroOrMore要素 の子要素の中で、choice要素, interleave要素 が存在しない部分は、定義の出現順位は保持されます。
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「zeroOrMore要素 @ ぽかぽか RELAX NG 工房」