value 要素
特定値のテキストを要求する要素
- ある要素の中身もしくは属性値において、ある特定の値を持つテキストのみを許すようにしたい場合、その値を value要素 として明示します。
- element要素 もしくは attribute要素 の子孫要素として主に用いられます。
- grammar 要素の直下には置いてはなりません。
属性
type 属性
データ型を指定します。
- type 属性 が存在する場合、先祖(もしくは自分自身の)要素の datatypeLibrary 属性 によるデータ型ライブラリに応じたデータ型が適用されます。当然ですが、value要素 の中身は、そのデータ型に準じたものでなければなりません。
- type 属性 が存在しない場合は、 type="token" が(暗示的に)指定されたものと見倣され、先祖要素の datatypeLibrary 属性 による指定は無視されます(RELAX NG 由来のデフォルトのデータ型になる)。
制約
value 要素は、 Mapping definition の以下の位置のみに現れることができます。
- - lang:value-of - lang:value -
- - dat:container - dat:value -
- - dat:container - lang:value-of - ums:value -
ただし、ここで dat:container は dat:byte, dat:bit, rng:element, rng:attribute などを示しています。以下は obsolete です。
- - lang:value-of - dat:container - ums:value -
子ノード
テキストノードを子に一つ持ち特定の値を定義します。
使用例
例 1: 要素の中身
例えば、 好物 要素の中身を ステーキ、ショートケーキ、クリームシチューの三つからの択一にしたい場合は、以下のような記述が考えられます。
- スキーマ(の一部)
-
<element name="好物"> <choice> <value>ステーキ</value> <value>ショートケーキ</value> <value>クリームシチュー</value> </choice> </element>
- 実際の XML 文書(の断片)の一例
-
- <好物>ショートケーキ</好物> <!-- 正しい -->
- <好物>ハンバーグ</好物> <!-- エラー -->
例 2: 属性値
例えば、 画像 要素において ファイル 属性と 配置 属性を定義し、ファイル属性は任意のテキスト、配置属性には 右、左 のどれかの値を入れられるようにしたい場合、以下のような記述が出来ます(要素は空要素とします)。
- スキーマ(の一部)
-
<element name="画像"> <empty/> <attribute name="ファイル"> <text/> </attribute> <attribute name="配置"> <choice> <value>右</value> <value>左</value> </choice> </attribute> </element>
- 実際の XML 文書(の断片)の一例
-
- <画像 ファイル="RheineRiver.jpg" 配置="左"/> <!-- 正しい -->
- <画像 ファイル="ObiRiver.gif" 配置="中央"/> <!-- エラー -->
以上の例のように、value要素 は、choice要素 と用いることが多いかと思われます。また、値を一つしか持ち得ないような場合は、choice要素 を介さず、value要素 を直截子要素として記述することが可能です。
DTD の如く「何も入れなかった場合の初期値」を決定することは出来ません。RELAX-NGはあくまで「XML文書の検証」をするための機構であり、何かしらの前提をスキーマ自身に盛りこむべきではない、との理念に基づいているからです。
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「value要素 @ ぽかぽか RELAX NG 工房」