mixed 要素
テキスト(ノード)の混在を許す要素
- 要素と共に任意の位置にテキストの混在を許したい場合、そのパターンを mixed要素 として明示します。いわゆる「インライン要素」を作るのに便利です。
- grammar 要素の直下には置いてはなりません。
- スキーマのルート要素に用いることが出来ます。ただし、そのスキーマは単独では用いることは出来ず、 externalRef 要素の参照先としてのみ利用できます。
属性
- この要素に固有な属性はありません。
子ノード
- 子ノードを持つことが必須です。
- 指定が無い場合、子ノードの出現順位や出現回数そのものは保持されます。
- 子ノードに value要素, data要素 を持つことが出来ます。ただし、text要素 など、それ自体に空白を含み得るデータを持つことは出来ません。区切りの関係が不明確になるためです。
- element要素, attribute要素 を子孫に入れてはいけません。
- 子要素パターンの出現順位の関係は保たれます(要素の中身, 属性値いずれにも当て嵌まります)。順位不同にしたい場合は、interleave要素, choice要素 などを適宜使う必要があります。
使用例
例 1:
説明要素の中に、インライン要素として 名前, 所属, 場所各要素がこの順番で出現するようにさせるためには、以下のようなスキーマ(の断片)を作成します。実際の文書の例も示します。
- スキーマ
-
<element name="説明"> <mixed> <element name="所属"><text/></element> <element name="名前"><text/></element> <element name="場所"><text/></element> </mixed> </element>
- 妥当な文書(の断片)例
-
<説明> 今日、<所属>テニス部</所属>の<名前>バッツ</名前>は、 <場所>202号教室</場所>にて会合に参加している。 </説明>
例 2:
interleave要素, zeroOrMore要素 などと組み合わせることにより、より高度な表現が可能になります。例えば、a要素と b 要素が任意のテキストを折り混ぜて任意の位置に任意の個数だけ並べられるようにするには、以下のように記述します。参考までに、mixed要素 を使わない例も併せて示します。
- mixed 要素を使った例
-
<element name="element"> <mixed> <interleave> <zeroOrMore> <element name="a"><text/></element> </zeroOrMore> <zeroOrMore> <element name="b"><text/></element> </zeroOrMore> </interleave> </mixed> </element>
- choice 要素を使った例
-
<element name="element"> <zeroOrMore> <choice> <element name="a"><text/></element> <element name="b"><text/></element> <text/> </choice> </zeroOrMore> </element>
上記の例では、choice要素 を用いた方がすっきりしたものが出来ます。ただし、「どれかを必須要素としたい」場合などは、choice要素 を使うことは出来ません。
例えば、「インライン要素a, b要素があり、a 要素は0個以上、 b 要素は一つだけ必ず出現しなければならない」というパターンを作りたい場合は、 mixed要素 と interleave要素 を使う必要があるでしょう。以下にスキーマの例を示します。
<element name="element"> <mixed> <interleave> <zeroOrMore> <element name="a"><text/></element> </zeroOrMore> <element name="b"><text/></element> </interleave> </mixed> </element>
考えてみよう!
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「mixed要素 @ ぽかぽか RELAX NG 工房」