倭マン's BLOG

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

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

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

  • <optional>
  • <oneOrMore>
  • <zeroOrMore>

<optional> 要素


<optional> 要素は「あってもなくてもよい」パターンを定義します。 正規表現では「?」に対応します。 例えば、次のようなスキーマ定義は

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <optional>
    <element name="child"><empty/></element>
  </optional>
</element>

次のどちらにもマッチします:

<parent/>
<parent><child/></parent>

★<choice>, <empty> との関係★

<optional> 要素は「子要素のスキーマ定義」または「<empty>」というパターンを定義します。 「または」は次回以降やる <choice> によって表すことができます。 つまり、上記のスキーマ定義は以下と同じと見なされます:

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <choice>
    <element name="child"><empty/></element>
    <empty/>
  </choice>
</element>

<oneOrMore> 要素


<oneOrMore> 要素は「1回以上繰り返される」パターンを定義します。 正規表現では「+」に対応します。 次のようなスキーマ定義は

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <oneOrMore>
    <element name="child"><empty/></element>
  </oneOrMore>
</element>

次のようなものにマッチします:

<parent><child/></parent>
<parent><child/><child/></parent>

<zeroOrMore> 要素


<zeroOrMore> 要素は「0回以上繰り返される」パターンを定義します。 正規表現では「*」に対応します。 次のようなスキーマ定義は

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <zeroOrMore>
    <element name="child"><empty/></element>
  </zeroOrMore>
</element>

次のようなものにマッチします:

<parent/>
<parent><child/><child/></parent>

★<oneOrMore> との関係★

<zeroOrMore> 要素は「<oneOrMore>」または「<empty>」というパターンを定義します。 したがって、<optional> と同じように、<choice> を用いて書き換えることができます:

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <choice>
    <oneOrMore>
      <element name="child"><empty/></element>
    </oneOrMore>
    <empty/>
  </choice>
</element>