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 要素の入れ子や階層構造は、異る言語のスキーマを取り込むことによる「マクロのかち合わせ」を避けるための一つの方法です。しかし、記述が繁雑になるため、通常はあまり用いられません。