include 要素
外部モジュールを取り込む要素
- 外部スキーマの定義を取り込むための要素です。
- 当然、取り込まれるスキーマは文法に則ったものでなければなりません。また、 grammar要素 をルート要素としないスキーマは取り込めません。替わりに externalRef要素 を用いてください。
- 必ず、 grammar要素 の直下に記述しなければなりません。その条件さえ満たしていれば、どこに置いても構いません。
- ref要素 で、外部スキーマに記述されたマクロを参照出来ます。ただし、定義されていないマクロを参照してはなりません。
- 異なる名前空間を持つスキーマも取り込むことが出来ます。このことにより、既に提供されている異なる種類のモジュールを単に組み合わせるだけで、名前空間の違いを配慮せずとも独自のスキーマを簡単に作ることが出来ます(当然、文書インスタンスでは、名前空間を考慮しなければなりません)。
属性
子ノード
- 単に取り込みたい場合は、空要素とします。
- その他、start要素, div要素, define要素 を子要素とすることが出来ます。
- include要素 直下の define要素 は、 include要素 で示される参照先のスキーマの定義の上書きをする場合にのみ用いられます。新たな定義をしたり、combine 属性 を用いた定義の結合をしたりすることは出来ません。
使用例
例 1: 再定義を含める場合
以下の一聯のファイルを例に挙げます。
- ファイル1: schema1.rng
-
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://lena.org/"> <start> <element name="document"> <ref name="para"/> </element> </start> <include href="schema2.rng"> <define name="em-content"> <!-- "em-content" の再定義 --> <text/> </define> </include> </grammar>
- ファイル2: schema2.rng
-
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://lena.org/"> <define name="para"> <element name="em"> <ref name="em-content"/> </element> </define> <define name="em-content"> <empty/> </define> </grammar>
以上の場合、 schema1.rng の内容は、以下の内容と等価になります (マクロの展開はしておりません)。
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://lena.org/"> <start> <element name="document"> <ref name="para"/> </element> </start> <define name="para"> <element name="em"> <ref name="em-content"/> </element> </define> <define name="em-content"> <text/> <!-- define 要素によって上書きされた --> </define> </grammar>
例 2: 異なる名前空間を有するスキーマの取り込み
以下の一聯のファイルを例に挙げます。
- ファイル1: schema1.rng
-
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://lena.org/"> <start> <element name="document"> <ref name="para"/> </element> </start> <include href="schema2.rng"/> </grammar>
- ファイル2: schema2.rng
-
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://batz.org/"> <define name="para"> <element name="em"><empty/></element> </define> </grammar>
以上の場合、 schema1.rng の内容は、以下の内容と等価になります。
<?xml version="1.0"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0" xmlns:lena="http://lena.org/" xmlns:batz="http://batz.org/"> <start> <element name="lena:document"> <ref name="para"/> </element> </start> <define name="para"> <element name="batz:em"><empty/></element> </define> </grammar>
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「include要素 @ ぽかぽか RELAX NG 工房」