今回も論理構造に関する要素。
- <choice>
- <group>
- <interleave>
- <mixed>
<choice> 要素
<choice> 要素は、子要素で定義されるパターンのうち、どれか1つを「選択」するパターンです。 次のスキーマ定義は
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <choice> <element name="child1"><empty/></element> <element name="child2"><empty/></element> </choice> </element>
以下のどちらにもマッチします:
<parent><child1/></parent>
<parent><child2/></parent>
★<choice> と <notAllowed>★
<notAllowed> 要素はどんなパターンにもマッチしないパターンです。 <choice> 要素の直下の <notAllowed> 要素は(無意味なので)無視されます。
<group> 要素
<group> 要素は、子要素で定義されるパターンが、そのままの順序で出現することを規定するパターンです。 次のスキーマ定義は
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <group> <element name="child1"><empty/></element> <element name="child2"><empty/></element> </group> </element>
以下の XML にマッチします:
<parent><child1/><child2/></parent>
ただし、上記の場合は <group> 要素を使う必要はありません。
<group> 要素を使う必要があるのは、例えば <choice> 要素の子要素としてです。 以下のスキーマ定義は
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <choice> <element name="child0"><empty/></element> <group> <element name="child1"><empty/></element> <element name="child2"><empty/></element> </group> <choice> </element>
次のいずれかにマッチします:
<parent><child0/></parent>
<parent><child1/><child2/></parent>
ただし、以下のものにはマッチしません:
<parent><child1/></parent>
<group> 要素を用いることによって、<child1>, <child2> 要素がセットで現れるように定義できます。
★<group> と <empy>★
<choice> 要素に対する <notAllowed> 要素と同じように、<group> 要素の直下の <empty> 要素は(無意味なので)無視されます。
<interleave> 要素
<interleave> 要素は、<group> 要素と似ていますが、子要素が定義するパターンの出現順序が任意であるところが違います。 例えば、次のスキーマ定義は
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <interleave> <element name="child1"><empty/></element> <element name="child2"><empty/></element> </interleae> </element>
以下のどちらにもマッチします:
<parent><child1/><child2/></parent>
<parent><child2/><child1/></parent>
★<interleave> と <zeroOrMore>★
<interleave> 要素と <zeroOrMore> 要素を併せて使うと便利なことがあるので、覚えておきましょう。 次のスキーマ定義は
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <interleave> <element name="child1"><empty/></element> <zeroOrMore> <element name="child2"><empty/></element> </zeroOrMore> </interleae> </element>
<parent> 要素の子要素として、<child1> 要素が1つと、<child2> 要素が任意個数現れるパターンです。 以下のいずれにもマッチします:
<parent><child1/></parent>
<parent><child1/><child2/></parent>
<parent><child2/><child1/><child2/></parent>
<parent><child1/><child2/><child2/></parent>
<mixed> 要素
<mixed> 要素は、「子要素と
<mixed xmlns="http://relaxng.org/ns/structure/1.0"> <element name="a"><text/></element> </mixed>
次のものと同じです:
<interleave xmlns="http://relaxng.org/ns/structure/1.0"> <text/> <element name="a"><text/></element> </mixed>
★混在内容モデル★
<mixed> は<zeroOrMore> 要素と併せて「混在内容モデル」を定義するのに用いられます。 「混在内容モデル」とは、テキストと任意個数の修飾タグ (?) が混ざったものです。 例えば HTML の一部の以下のようなものです:
<b>いろ</b>はにほへとちりぬるを<b>わがよ</b>たれそつねならむ
これに対するスキーマ定義は次のようになります:
<mixed xmlns="http://relaxng.org/ns/structure/1.0"> <zeroOrMore> <element name="b"><text/></element> </zeroOrMore> </mixed>