ENGLISH | JAPANESE |
RELAXでは,element
という要素を生け垣モデルとして許しています.これは単なる略記法であり,ref
とelementRule
とtag
に展開されます.この節では,まずelement
要素の目的を説明し,次に機構を説明します.
RELAXはDTDの拡張であり,文法的なデータモデルを持っています.これは,プログラミング言語やデータベースのデータモデルとは異質なものです.しかし,RELAXでプログラミング言語の宣言やデータベース言語のスキーマを真似ることは考えておく必要があります.
プログラミング言語では,変数を宣言するときに同時にその型を宣言します.次の例では,変数x
とy
を宣言し,型としてint
を指定しています.
public class Point { int x; int y; }
変数x
が別のクラスで宣言されるときは,異なる型を指定されているかも知れません.次の例では,float
型がクラスFoo
のx
に対して指定されています.
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
要素によって置き換えられます.また,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
要素の生成ref
要素を生成します.そのlabel
属性の値として,他のラベルと衝突しないラベルが自動生成されます.もし,element
要素にoccurs
属性があれば,生成されたref
要素に引き継がれます.
elementRule
要素の生成elementRule
を生成します.そのrole
属性の値として,他の役割と衝突しない役割が生成されます.label
属性の値は,ref
要素を生成したときに自動生成したラベルです.このelementRule
の生け垣モデルとして,element
要素のtype
属性を転記します.
tag
要素の生成tag
要素を生成します.elementRule
を生成するときに自動生成した役割がrole
属性として指定されます.生成されたtag
のname
属性としては,元々のelement
要素のname
属性の値が指定されます.
プログラミング言語やデータベースの人たちは,element
要素による記述は,とても自然で分かりやすいと思います.RELAX!