倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

要素の概要 (5) -- 値

今回は文法構造に関する要素。

  • <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> 要素はテキストの型を指定します。 デフォルトでは、stringtoken の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 属性は、以下のように検索されます:

  1. @datatypeLibrary 属性が指定されていれば、それを使用します。
  2. @datatypeLibrary 属性が指定されていなければ、祖先要素に遡って @datatypeLibrary 属性を探し、最も近いものを使用します。
  3. 祖先要素にも @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 属性以外に外部ライブラリが必要です