ENGLISH | JAPANESE |
<< | リラックスのしかた/第一部: RELAX Core/STEP 10: elementRuleへのtagの埋め込み |
tag
要素のelementRule
要素への埋め込みについて説明します.tag
とattPool
に,生け垣モデルはelementRule
とhedgeRule
に記述されます.elementRule
は,役割を通じてtag
を参照し,このtag
がさらにattPool
を参照します.elementRule
とあるtag
が密接に関連している場合には,両者を分離するのではなく,一つの要素にまとめてしまうほうが便利なこともあります.elementRule
とtag
とに分離した記述の例として,STEP 8にある例をもう一度示します.
<!-- Case 1: type="integer" --> <tag name="val" role="val-integer"> <attribute name="type" type="NMTOKEN" required="true"> <enumeration value="integer"/> </attribute> </tag> <elementRule role="val-integer" label="val" type="integer"/> <!-- Case 2: type="string" --> <tag name="val" role="val-string"> <attribute name="type" type="NMTOKEN" required="true"> <enumeration value="string"/> </attribute> </tag> <elementRule role="val-string" label="val" type="string"/> |
ここで,役割val-integer
, val-string
がこの二つのelementRule
要素からだけしか参照されていないとします.わざわざval-integer
, val-string
という二つの名前をつけて参照するより,以下のように直接埋め込みたくなります.
<!-- Case 1: type="integer" --> <elementRule label="val" type="integer"> <tag> <attribute name="type" type="NMTOKEN" required="true"> <enumeration value="integer"/> </attribute> </tag> </elementRule> <!-- Case 2: type="string" --> <elementRule label="val" type="string"> <tag> <attribute name="type" type="NMTOKEN" required="true"> <enumeration value="string"/> </attribute> </tag> </elementRule> |
この書き方の利点は,役割に名をつけて参照する必要がないことです.書き直す前は,タグ名ともラベルとも違う名前をつけていました.この名前がなくなった分だけ,読むときの負担が減っています.
属性と生け垣モデルとを同時に記述できることを利点と感じる人もいます.たとえば,x座標とy座標を持つ点を,XMLで二通りに表現した例を以下に示します.前者では,属性によって表現し,後者では要素によって表現しています.両者の差異は僅かであり,書き換えが容易に可能です.
<elementRule label="point" type="emptyString"> <tag> <attribute name="x" type="integer"/> <attribute name="y" type="integer"/> </tag> </elementRule> |
<elementRule label="point"> <tag/> <sequence> <element name="x" type="integer"/> <element name="y" type="integer"/> </sequence> </elementRule> |
tag
を含むelementRule
は,role
属性を持つことは許されません.その代わりに,label
属性は必須です.
埋め込まれたtag
がrole
属性をもつことも許されません.この例では省略されていますが,name
属性を持つことは許されています.
tag
は,elementRule
から取り出され,その兄弟要素になります.本STEPの最初の例を用いて説明します.
<elementRule label="val" type="integer"> <tag> <attribute name="type" type="NMTOKEN" required="true"> <enumeration value="integer"/> </attribute> </tag> </elementRule> |
まず,適当な役割を生成します.この例では,val$1
という役割を生成しています.
次に,埋め込まれたtag
要素をelementRule
から取り出し,その兄弟要素として配置します.role
属性を追加し,先に生成した役割のval$1
を属性値として指定します.
tag
要素がname
属性を持っていないときに限って,name
属性を追加します.値としては,elementRule
要素のlabel
属性の値を用います.この例では,tag
要素のname
属性の値として"val"
を指定します.
最後に,elementRule
にrole
属性を追加し,先に生成した役割を指定します.
<elementRule label="val" type="integer" role="val$1"> </elementRule> <tag name="val" role="val$1"> <attribute name="type" type="NMTOKEN" required="true"> <enumeration value="integer"/> </attribute> </tag> |
tag
の埋め込みによって,簡潔で分かりやすい記述が可能になります.RELAX!<< | リラックスのしかた/第一部: RELAX Core/STEP 10: elementRuleへのtagの埋め込み |