| ENGLISH | JAPANESE |
| << | リラックスのしかた/第一部: RELAX Core/STEP 9: 生け垣内容モデルelement | >> |
elementという要素を生け垣モデルとして許しています.これは単なる略記法であり,refとelementRuleとtagに展開されます.この節では,まずelement要素の目的を説明し,次に機構を説明します.xとyを宣言し,型としてintを指定しています.
public class Point {
int x;
int y;
}
|
変数xが別のクラスで宣言されるときは,異なる型を指定されているかも知れません.次の例では,float型がクラスFooのxに対して指定されています.
public class Foo {
float x;
}
|
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> |
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要素によって置き換えられます.また,elementRuleとtagがそれぞれに対して生成されます.生成されるelementRuleの生け垣モデルは,elementのtype属性で指定されたデータ型への参照です.
<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属性が付与されます.たとえば,最初のelementRuleでelementにoccurs="?"が指定されたとします(下記参照).
<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要素を生成します.そのlabel属性の値として,他のラベルと衝突しないラベルが自動生成されます.もし,element要素にoccurs属性があれば,生成されたref要素に引き継がれます.elementRuleを生成します.そのrole属性の値として,他の役割と衝突しない役割が生成されます.label属性の値は,ref要素を生成したときに自動生成したラベルです.このelementRuleの生け垣モデルとして,element要素のtype属性を転記します.tag要素を生成します.elementRuleを生成するときに自動生成した役割がrole属性として指定されます.生成されたtagのname属性としては,元々のelement要素のname属性の値が指定されます.element要素による記述は,とても自然で分かりやすいと思います.RELAX!| << | リラックスのしかた/第一部: RELAX Core/STEP 9: 生け垣内容モデルelement | >> |