今回は文法構造に関する要素。
- <value>
- <data>
- <param>
- <list>
<value> 要素
<value> は「属性の値」や「テキストの内容」を指定します。
例えば、<version> 要素の子テキストが "1.0" であることを指定したい場合、つまり
<version>1.0</version>
という文書を定義したい場合、スキーマ定義は以下のようにします:
<element name="version" xmlns="http://relaxng.org/ns/structure/1.0"> <value>1.0</value> </element>
★値の選択★
幾つかの値の中から選択したい場合は <choice> 要素を用います:
<element name="version" xmlns="http://relaxng.org/ns/structure/1.0"> <choice> <value>1.0</value> <value>1.1</value> </choice> </element>
この場合、以下のどちらの文書もマッチします:
<version>1.0</version>
<version>1.1</version>
<data> 要素, <param> 要素
<data> 要素はテキストの型を指定します。 デフォルトでは、string と token の2つの型が使用できます。 データ型は @type 属性で指定します:
<data type="string"/>
token と string の違いは文字列の比較の仕方にあります:
- token : 空白補正*1 を行った結果を比較する。
- string : 空白補正をせずに比較する
例えば、2つの文字列 "xml" と " xml " は、token としては一致しますが、string としては一致しません。
★制限★
データ型に制限を加えたい場合は、<param> 要素によってパラメータを指定します:
<data type="string"> <param name="maxLength">127</param> </data>
使用できるパラメータは、データ型によって異なります。
★データ型ライブラリ★
@datatypeLibrary 属性を指定することによって、RELAX NG に定義されていないデータ型も使用することができます。 例えば W3C XML Schema で定義されているデータ型を使うためには以下のようにします*2:
<data type="integer" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
使用される @datatypeLibrary 属性は、以下のように検索されます:
- @datatypeLibrary 属性が指定されていれば、それを使用します。
- @datatypeLibrary 属性が指定されていなければ、祖先要素に遡って @datatypeLibrary 属性を探し、最も近いものを使用します。
- 祖先要素にも @datatypeLibrary 属性がない場合は RELAX NG に組み込まれているデータ型が使われます。
<list> 要素
<list> 要素は空白で区切られたデータのリストを定義します。 例えば、2つのトークンからなるテキストを定義したい場合、以下のようにします:
<element name="name" xmlns="http://relaxng.org/ns/structure/1.0"> <list> <data type="token"/> <data type="token"/> </list> </element>
これは以下の文書にはマッチします:
<name>abc def</name>
一方、以下の文書にはマッチしません:
<name>abc</name>
<name>abc def ghi</name>
★<oneOrMore> などとの併用★
以下のようなスキーマ定義は、1つ以上のトークンのリストにマッチします:
<element name="name" xmlns="http://relaxng.org/ns/structure/1.0"> <list> <oneOrMore> <data type="token"/> </oneOrMore> </list> </element>
*1:whitespace normalization。 先頭と末尾の空白を切り捨て、連続した空白文字を1つのスペースに置き換える変形。
*2:Jing や msv ではデフォルトで W3C XML Schema のデータ型がサポートされていますが、それら以外のものは @datatypeLibrary 属性以外に外部ライブラリが必要です→