ENGLISHJAPANESE
<< リラックスのしかた/第一部: RELAX Core/STEP 10: elementRuleへのtagの埋め込み

STEP 10: elementRuleへのtagの埋め込み


$Id: step10.sdoc 1.8 2000/11/01 13:46:38 murata Exp $
この節では,tag要素のelementRule要素への埋め込みについて説明します.

属性と生け垣モデルの同時記述

STEP 0から9まででは,属性やタグ名と,生け垣モデルは分離して記述されました.属性やタグ名はtagattPoolに,生け垣モデルはelementRulehedgeRuleに記述されます.elementRuleは,役割を通じてtagを参照し,このtagがさらにattPoolを参照します.
あるelementRuleとあるtagが密接に関連している場合には,両者を分離するのではなく,一つの要素にまとめてしまうほうが便利なこともあります.
elementRuletagとに分離した記述の例として,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属性は必須です.
埋め込まれたtagrole属性をもつことも許されません.この例では省略されていますが,name属性を持つことは許されています.

埋め込まれたtagの処理

埋め込まれた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"を指定します.
最後に,elementRulerole属性を追加し,先に生成した役割を指定します.

<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の埋め込み