前回、RELAX NG に定義されている要素を分類しましたが、それぞれのカテゴリに属する要素を簡単に見ていきます(参考「RELAX NG 入門」)。
今回は XML ノードを定義する要素。
- <element>
- <empty>
- <attribute>
- <text>
<element> 要素, <empty> 要素
<element> 要素は要素を定義する要素です。 @name 属性によって要素名を指定します。
例えば、次のような、ルート要素しか持たない XML 文書に対して
<root/>
これに適合する RELAX NG スキーマは以下のようになります:
<element name="root" xmlns="http://relaxng.org/ns/structure/1.0"> <empty/> </element>
幾つか注意を:
- 名前空間宣言は、<element>, <empty> が名前空間 "http://relaxng/ns/structure/1.0" に属するようにしています。
- 「<element name="root" ...」で <root> 要素を定義しています。
- 定義対象の要素が属性も子ノードも持たない場合は、スキーマ定義に <empty> 要素を付加します。
- 名前空間を指定する方法はそのうちに。
★子要素を定義する★
子要素を定義したい場合は、<element> 要素の子要素としてまた <element> 要素を付加します。 例えば、以下のような XML 文書に対して
<parent> <child1/> <child2/> </parent>
スキーマ定義は次のようになります:
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <element name="child1"> <empty/> </element> <element name="child2"> <empty/> </element> </element>
★要素の順序★
要素の出現順序は、スキーマ定義に現れる順序と一致していなければなりません。 例えば、上記のスキーマ定義は次のXML 文書にはマッチしません:
<parent> <child2/> <child1/> </parent>
<attribute> 要素
<attribute> は属性を定義する要素です。 @name 属性によって属性名を指定します。
例えば、次のような属性を持つ要素を考えましょう:
<parent att="value"/>
これに適合する RELAX NG スキーマは以下のようになります:
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <attribute name="att"><text/></attribute> </element>
幾つか注意を:
- <element> 要素は <parent> 要素を定義しています。
- 「<attribute name="att" ...」で @att 属性を定義しています。
- <attribute> 要素に <text> 要素を付加することで、@att 属性の値がテキストであることを定義しています。
- <parent> 要素のスキーマ定義に対して、属性が定義されていれば子要素がなくても <empty> 要素を付加する必要はありません。
- 名前空間を指定する方法はそのうちに。
★チョット簡略化★
<attribute> 要素の子要素となる <text> 要素は省略できます。 例えば、上記のスキーマ定義は次の様に簡略化できます:
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <attribute name="att"/> </element>
★属性の順序★
属性の出現順序は、要素の場合と違って、スキーマ定義に現れる順序と一致する必要はありません。 例えば、次のスキーマ定義は
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <attribute name="att1"/> <attribute name="att2"/> </element>
以下のどちらの XML 文書にもマッチします:
<parent att1="value1" att2="value2"/>
<parent att2="value2" att1="value1"/>
★子要素と属性の順序★
子要素の定義の後に属性の定義が現れてもかまいません。 例えば、次のスキーマ定義は
<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <element name="child"><empty/></element> <attribute name="att"/> </element>
以下の XML 文書にマッチします:
<parent att="value"> <child/> </parent>
<text> 要素
<text> 要素は(すでに何度か出てきましたが)以下のような定義に使います:
- 要素の子要素 → 子テキスト
- 属性の子要素 → 属性の値
子テキストの場合だけサンプルを見てみましょう。 以下のようなスキーマ定義は
<element name="em" xmlns="http://relaxng.org/ns/structure/1.0"> <text/> </element>
以下の XML 文書にマッチします:
<em>テキスト</em>