except 要素
排他法則を記述するための要素
- 特定の要素/属性名を対象から外したい場合や、特定のデータを排除したい場合は、 except要素 を用いて排他法則を明記します。
- 要素/属性名の排他処理のための anyName要素, nsName要素 各要素の子要素として記述します。
- data要素 の子要素にすることも出来ます。この場合、except要素 の中身として、各種のパターンを記述することが可能です。ただし、テキストにそぐわない要素を記述することは出来ません。例えば、element要素, attribute要素 は記述出来ません。
属性
- この要素に固有な属性はありません。
子ノード
except要素 の中身は、nsName要素, name要素, choice要素 のみです。
使用例
例 1: 特定の名前を排除する
例えば、公開情報 要素の中にはいかなる要素も複数個入れられる一方、 極秘 要素と 機密 要素のみを排除させるようにするには、以下のようにします。
<element name="公開情報"> <zeroOrMore> <element> <anyName> <except> <name>極秘</name> <name>機密</name> </except> </anyName> <text/> <!-- いかなる要素においても、中身はテキストとする --> </element> </zeroOrMore> </element>
属性名においても、同様に制馭が出来ます。
例 2: 要素の振り分け
記入欄 要素にはいかなる要素も複数個入れられ、中身にはテキストが記入できるとします。また、 記入が無い場合は、 記入無し 要素(空要素)を一つだけ含むようにしたいとします。この場合、choice要素 を用いて、以下のようにスキーマを記述出来ます。
- スキーマ(の断片)の例
-
<element name="記入欄"> <choice> <zeroOrMore> <element> <anyName> <except> <name>記入無し</name> <!-- 記入無し 要素は特別扱い --> </except> </anyName> <text/> </element> </zeroOrMore> <element name="記入無し"> <!-- 記入無し 要素はこちらで定義 --> <empty/> </element> </choice> </element>
- 妥当な XML 文書(の断片)1
-
<記入欄> <名前>ラーナ=シャルロット</名前> <年齢>16</年齢> <好きな食べ物>ショートケーキ、パイナップル</好きな食べ物> </記入欄>
- 妥当な XML 文書(の断片)2
-
<記入欄> <記入無し/> </記入欄>
- 妥当でない XML 文書
-
<記入欄> <name>Y. Imada</name> <記入無し/> <!-- 記入無し 要素以外には、何も入れられない !! --> </記入欄>
例 3: 特定の名前空間に属する名前を排除する
例えば、名前空間URI http://www.evil.com/ に属する要素だけを排除し、あとはいかなる要素も入れられるようにするためには、例えば以下のように記述します。
<element name="記入欄"> <zeroOrMore> <element> <anyName> <except> <nsName ns="http://www.evil.com/"/> </except> </anyName> <text/> <!-- いかなる要素においても、中身はテキストとする --> </element> </zeroOrMore> </element>
例 4: データの排他処理
例えば、何らかのデータを扱っている中で、未定義のデータ(例えば undefined や 未定義, none)を弾きたい場合には、以下のような記述が考えられます。
<element name="情報"> <data type="string"> <except> <choice> <value>undefined</value> <value>未定義</value> <value>none</value> </choice> </except> </data> </element>
あるいは、怪しい記述が含まれているデータ(例えば 押売, 強盗, 死 を含むもの)を弾くのにも用いることが可能です。ここでは、データ型ライブラリとして W3C XML Schema のデータ型を使います。
<element name="活動内容"> <data type="string" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> <except> <data type="string"> <param name="pattern">[.\s]*(押売|強盗|死)[.\s]*</param> </data> </except> </data> </element>
参考文献
- James Clark and Makoto Murata, ISO/IEC FDIS 19757-2 Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
- 古林 寛, 「except要素 @ ぽかぽか RELAX NG 工房」