倭マン's BLOG

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

要素の概要 (4) -- 文法構造

今回は文法構造に関する要素。

  • <grammar>
  • <start>
  • <define>
  • <ref>
  • <notAllowed>
  • <div>
  • <parentRef>

<grammar> 要素, <start> 要素, <define> 要素


簡単なスキーマ定義の場合、定義対象の文書のルート要素を定義する <element> 要素を、スキーマ定義のルート要素にするのが簡単です:

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

しかし、複雑なスキーマ定義になると、以下のように <grammar>, <start>, <define> 要素を用います。 上記のスキーマ定義をこれらの要素をもちいて書き換えると、次のようになります:

<grammar xmlns="http://relaxng.org/ns/structure/1.0">

  <start>
    <ref name="root"/>
  </start>

  <define name="root">
    <element name="root">
      <empty/>
    </element>
  </define>

</grammar>
  • <start> 要素の直下に(<define> 要素の代わりに) <element> 要素を書くこともできます。 この場合 <define> 要素は必要ありません。
  • <ref> 要素の @name 属性と <define> 要素の @name 属性は、一致していればどんな文字列でも構いません。 <define> 直下に要素の定義がある場合は、その要素の名前にしておく方が可読性は増しますが*1

★ルート要素でない <grammar> 要素★

<grammar> 要素は、必ずしもルート要素としてしか書けないわけではありません。 パターンが書ける箇所(例えば <start> 要素や <define> 要素の子要素としてなど)には何処でも <grammar> 要素が書けます。 これも子要素の <start> から始まるパターンとして解釈されます。

<notAllowed> 要素


<notAllowed> 要素はいかなるパターンともマッチしません。 大抵(外部ファイルとして)パターン・テンプレートを作成する際に用います。 <include> 要素のときに取り上げるかも。

<div> 要素


<div> 要素は <define> 要素をカテゴリー分けするに使います。

<parentRef> 要素


これは入れ子の <grammar> 要素(もしくは <include> 要素)の中から、その <grammar> 要素の親要素から参照できる <define> 要素を参照するのに使います:

<grammar xmlns="http://relaxng.org/ns/structure/1.0">

  <start>
    <ref name="root"/>
  </start>

  <define name="root">

    <grammar>

      <start>
        <parentRef name="rootDef"/>
      </start>

      <!-- こちらは参照されない -->
      <define name="rootDef">
        <element name="child-root"/>
      </define>

    </grammar>

  </define>

  <!-- こちらが参照される -->
  <define name="rootDef">
    <element name="parent-root">
      <empty/>
    </element>
  </define>

</grammar>

<parentRef> 要素も <include> 要素と一緒に用いて、(外部の)パターン・テンプレートを作成するのに用いることができます。

*1:全く同じにすると逆に分かり難いので、拙者は頭文字のみ大文字にしたりしますが。