ref
要素を用います。しかし、grammar
要素が入れ子になっている場合には、参照元の属する grammar
要素から外れた場所に存在するマクロは参照することが出来ません。parentRef
要素を用いることで、親階層に存在するマクロを参照することが出来ます。ref
要素と同様、 parentRef
要素には中身はありません。常に空要素です。name
属性によって明示します。以下のスキーマを考えてみます。
<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
を参照することも出来ません。
私
要素内から親階層に存在する想い出の品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
、つまり「卒業アルバム
」に変わります。
grammar
要素の入れ子や階層構造は、異る言語のスキーマを取り込むことによる「マクロのかち合わせ」を避けるための一つの方法です。しかし、記述が繁雑になるため、通常はあまり用いられません。