今回は文法構造に関する要素。
- <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:全く同じにすると逆に分かり難いので、拙者は頭文字のみ大文字にしたりしますが。