parentRef 要素
親階層のマクロを参照する要素
- 通常、マクロを参照するためには ref要素 を用います。しかし、grammar要素 が入れ子になっている場合には、参照元の属する grammar要素 から外れた場所に存在するマクロは参照することが出来ません。
- parentRef要素 を用いることで、親階層に存在するマクロを参照することが出来ます。
- grammar要素 の入れ子や階層構造は、異る言語のスキーマを取り込むことによる「マクロのかち合わせ」を避けるための一つの方法です。しかし、記述が繁雑になるため、通常はあまり用いられません。
属性
子ノード
(ref要素 と同様)
- 常に空要素。子ノードを持ちません。
使用例
例 1: ref要素 の場合
以下のスキーマを考えてみます。
<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要素 を用いた場合
私要素内から親階層に存在する想い出の品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、つまり「卒業アルバム」に変わります。
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「parentRef要素 @ ぽかぽか RELAX NG 工房」