define
要素の中身とします。いくつかのファイルに分けて「モジュール」を作りたい場合、必携の要素となります。define
要素の中身は、常に ref
要素から参照されます。 externalRef
, include
各要素などでは参照出来ません。grammar
要素もしくは include
要素の子要素として記述しなければなりません。 define
要素を入れ子にしたり、各種パターン要素の子要素としたりしてはなりません。define
要素 と ref
要素が対応します。 ただし、 include
要素を用いて外部ファイルの取り込みを行っている場合は、参照元(ref
) と参照先(define
) が異なるファイル内に存在しても構いません。ただし、 ref
要素の参照先が取り込みファイルの中に存在しない場合はエラーとなります。name
属性によって定義します。name
属性の属性値は NCName となっているため、名前空間が異なる要素/属性宣言の中でも、同じ名前を使って参照することが出来ます。ただし、接頭辞と名前を区切るための :
は使用出来ません。ピリオドやハイフン、アンダースコアは利用できます。尚、大文字小文字は区別されるので、注意してください。combine
属性で、結合法則を明示出来ます(詳しくは後述)。grammar
要素の子要素として記述する場合は、 combine
属性で結合法則を明示しなければなりません。 combine
属性には、 choice
もしくは interleave
どちらかの値を取ることが出来ます。include
要素の子要素として記述する場合は、「定義の上書き」のみが可能です。当然マクロの名前は、 参照先の外部ファイルの中に含まれていなければなりません。新たなマクロの定義や、 combine
属性を用いた「定義の結合」は出来ません。define
要素はあまりよろしくないと思います。モジュールの組み込みにおいて「記述不可能」の旨の初期値を定義したい場合は、 empty
要素を子要素に入れるのが最適でしょう。ただし、ここで notAllowed
要素を用いるとややこしいことになるので、注意が必要です (詳しくは「notAlloed 要素の解説」にて)。element
, attribute
各要素などを子要素にすることが可能ですが、してはいけないものもあります。例えば、要素/属性名の排他定義(◎◎と△△以外の全ての要素を中身にするような定義)の中では、 define
, ref
各要素によるマクロの取り込みが出来ません。例えば、次のような記述は不可能です。
<element> <anyName> <except> <!-- except 要素による排他法則の定義 --> <ref name="exceptRule"/> <!-- 取り込み不可能!! --> </except> </anyName> .... </element> <define name="exceptRule"> <choice> <name>abc</name> <name>def</name> </choice> </define>
ただし、ref
, define
を使わず、直截 define
要素の中身を except
要素の中に記述すれば、全く問題はありません。
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0"> <start> <element name="document"> <ref name="para"/> <!-- マクロの参照 --> </element> </start> <include href="schema2.rng"/> <!-- 外部ファイル取り込み --> <define name="para" combine="choice"> <element name="strong"><empty/></element> </define> </grammar>
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0"> <define name="para"> <!-- 外部ファイル中の define 要素 --> <element name="em"><empty/></element> </define> </grammar>
上記のスキーマをマクロを使用しないで記述した場合、以下のようになります。
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0"> <start> <element name="document"> <choice> <!-- define 要素の combine 属性による効果 --> <element name="strong"><empty/></element> <element name="em"><empty/></element> </choice> </element> </start> </grammar>