ENGLISHJAPANESE
<< リラックスのしかた/第一部: RELAX Core/STEP 9: 生け垣内容モデルelement >>

STEP 9: 生け垣内容モデルelement


RELAXでは,elementという要素を生け垣モデルとして許しています.これは単なる略記法であり,refelementRuletagに展開されます.この節では,まずelement要素の目的を説明し,次に機構を説明します.

プログラミング言語やデータベース言語の模倣

RELAXはDTDの拡張であり,文法的なデータモデルを持っています.これは,プログラミング言語やデータベースのデータモデルとは異質なものです.しかし,RELAXでプログラミング言語の宣言やデータベース言語のスキーマを真似ることは考えておく必要があります.
プログラミング言語では,変数を宣言するときに同時にその型を宣言します.次の例では,変数xyを宣言し,型としてintを指定しています.

public class Point {
    int x;
    int y;
}

変数xが別のクラスで宣言されるときは,異なる型を指定されているかも知れません.次の例では,float型がクラスFooxに対して指定されています.

public class Foo {
    float x;
}

element要素

element要素は,変数名と型の指定を同時に行うための要素生け垣モデルです.element要素は,必ずname属性typeを持ちます.さらに,occurs属性も持つことができます.

<element name="tag-name" type="datatype-name"/>

<element name="tag-name" type="datatype-name" occurs="*"/>

element要素を用いることによって次のようなtag要素とelementRule要素が書けます.

<tag name="Point"/>

<elementRule role="Point">
  <sequence>
    <element name="x" type="integer"/>
    <element name="y" type="integer"/>
  </sequence>
</elementRule>

x=100かつy=200であるようなPointは次のXML文書によって表現できます.

<Point>
  <x>100</x>
  <y>200</y>
</Point>

ref, elementRule, tagへの展開

element要素は単なる構文糖衣(syntax sugar)です.生け垣モデル中のelement要素はref要素に置き換えられ,elementRule要素とtag要素が生成されます.
前節のelementRuleをもう一度示します.このelement要素がどう展開されるかを考えてみます.

<elementRule label="Point">
  <sequence>
    <element name="x" type="integer"/>
    <element name="y" type="integer"/>
  </sequence>
</elementRule>

どちらのelement要素もref要素によって置き換えられます.また,elementRuletagがそれぞれに対して生成されます.生成されるelementRuleの生け垣モデルは,elementtype属性で指定されたデータ型への参照です.

<elementRule label="Point">
  <sequence>
    <ref label="Point$1"/>
    <ref label="Point$2"/>
  </sequence>
</elementRule>

<elementRule role="Point$1" label="Point$1" type="integer"/>
<tag role="Point$1" name="x"/>

<elementRule role="Point$2" label="Point$2" type="integer"/>
<tag role="Point$2" name="y"/>

element要素がoccurs属性を持っているときは,生成されるref要素にoccurs属性が付与されます.たとえば,最初のelementRuleelementoccurs="?"が指定されたとします(下記参照).

<elementRule label="Point">
  <sequence>
    <element name="x" type="integer" occurs="?"/>
    <element name="y" type="integer" occurs="?"/>
  </sequence>
</elementRule>

展開の結果は次のようになります.

<elementRule label="Point">
  <sequence>
    <ref label="Point$1" occurs="?"/>
    <ref label="Point$2" occurs="?"/>
  </sequence>
</elementRule>

<elementRule role="Point$1" label="Point$1" type="integer"/>
<tag role="Point$1" name="x"/>

<elementRule role="Point$2" label="Point$2" type="integer"/>
<tag role="Point$2" name="y"/>

展開手続き

ここではelement要素がどう展開されるかをまとめておきます.

ref要素の生成

ref要素を生成します.そのlabel属性の値として,他のラベルと衝突しないラベルが自動生成されます.もし,element要素にoccurs属性があれば,生成されたref要素に引き継がれます.

elementRule要素の生成

elementRuleを生成します.そのrole属性の値として,他の役割と衝突しない役割が生成されます.label属性の値は,ref要素を生成したときに自動生成したラベルです.このelementRuleの生け垣モデルとして,element要素のtype属性を転記します.

tag要素の生成

tag要素を生成します.elementRuleを生成するときに自動生成した役割がrole属性として指定されます.生成されたtagname属性としては,元々のelement要素のname属性の値が指定されます.

まとめ

プログラミング言語やデータベースの人たちは,element要素による記述は,とても自然で分かりやすいと思います.RELAX!

<< リラックスのしかた/第一部: RELAX Core/STEP 9: 生け垣内容モデルelement >>