倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

要素の概要 (3) -- 論理構造 2

今回も論理構造に関する要素。

  • <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> 要素は、「子要素と 要素との interleave」と同じです。 例えば、以下のスキーマ

<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>