myGroup > myProject
 

parentRef 要素

親階層のマクロを参照する要素

  • 通常、マクロを参照するためには ref要素 を用います。しかし、grammar要素 が入れ子になっている場合には、参照元の属する grammar要素 から外れた場所に存在するマクロは参照することが出来ません。
  • parentRef要素 を用いることで、親階層に存在するマクロを参照することが出来ます。
  • grammar要素 の入れ子や階層構造は、異る言語のスキーマを取り込むことによる「マクロのかち合わせ」を避けるための一つの方法です。しかし、記述が繁雑になるため、通常はあまり用いられません。

属性

name 属性

参照するマクロ名を明示します。

子ノード

(ref要素 と同様)

  • 常に空要素。子ノードを持ちません。

使用例

例 1: ref要素 の場合

<span class="codefrag">ref</span>要素 の場合

以下のスキーマを考えてみます。

<grammar xmlns="http://relaxng.org/ns/structure/1.0">

<define name="想い出の品1">
 <value>卒業アルバム</value>
</define>

<start>
 <element name="僕">
  <choice>
   <ref name="想い出の品1"/>
			<grammar>
    <start>
     <element name="私">
      <ref name="想い出の品2"/>
     </element>
    </start>
    <define name="想い出の品2">
     <value>ビーズのネックレス</value>
    </define>
   </grammar>
  </choice>
 </element>
</start>

</grammar>

grammar要素 が入れ子になっているため、要素にある想い出の品1のマクロは、要素のそれとは「違う階層に属するもの」として扱われます。

ref要素 は「同じ grammar要素 の階層に存在するマクロ」しか参照しません。従って上記の例では、マクロそのものを移動させない限り、いかなるマクロ名を用いたとしても、以下の二種類の文書しか妥当として扱われません。

  • <僕>卒業アルバム</僕>
  • <僕><私>ビーズのネックレス</私></僕>

また、ref要素 では、要素内から 想い出の品1 を参照することも出来ませんし、要素内から想い出の品2 を参照することも出来ません。

例 2: parentRef要素 を用いた場合

<span class="codefrag">parentRef</span>要素 を用いた場合

要素内から親階層に存在する想い出の品1のマクロを参照する場合は、以下のように書き直します。

<grammar xmlns="http://relaxng.org/ns/structure/1.0">

<define name="想い出の品1">
 <value>卒業アルバム</value>
</define>

<start>
 <element name="僕">
  <choice>
   <ref name="想い出の品1"/>
   <grammar>
    <start>
     <element name="私">
      <parentRef name="想い出の品1"/>
     </element>
    </start>
    <define name="想い出の品2">
     <value>ビーズのネックレス</value>
    </define>
   </grammar>
  </choice>
 </element>
</start>

</grammar>

このようにすることで、要素が取り得る中身は、想い出の品1、つまり「卒業アルバム」に変わります。

参考文献