define 要素で定義されたマクロを、他のパターンの中で参照し、埋め込むための要素です。grammar 要素の子要素として記述することは出来ません。include 要素や externalRef 要素を使って外部ファイルを取り込んでいる場合は、異なるファイル間で ref 要素と define 要素が対応していても構いません。name, anyName, nsName 各要素の「置き換え」としては使えない、ということです。当然、要素や属性名の定義に関係した記述は「モジュール化」は出来ません。externalRef 要素の参照先としてのみ利用できます。name 属性で指定します。 NCName なので、コロンは使えません。アンダースコア、ハイフン、ピリオドは使用できます。大文字小文字は区別されますので、注意してください。また、参照先が define 要素で定義されていない場合はエラーになります。ns, xmlns:xxx, datatypeLibrary 各属性が使用できます。例えば、外部ファイルへの参照を行う場合、名前空間やデータ型の再定義をしたい際に使用出来ます。自分自身が含まれるパターンを取り込んだり、参照先の定義に自分自身への参照先を記述したりすることも可能です。例えば、以下の記述では、 nest 要素が無限に入れ子可能であることが定義されています。
<define name="NestPattern"> <element name="nest"> <ref name="NestPattern"/> </element> </define>
ただし、このような入れ子が可能であるのは、大抵は要素の中身の定義内のみに限られます。属性の定義を入れ子にすることなどはもともと不可能なので、上記のような記述は出来ません。
define 要素の説明を参照してください。