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 | >> |