except 要素

排他法則を記述するための要素

要素/属性名の排他処理のための except 要素

記述の原則

記述例

特定の名前を排除する

例えば、公開情報 要素の中にはいかなる要素も複数個入れられる一方、 極秘 要素と 機密 要素のみを排除させるようにするには、以下のようにします。

<element name="公開情報">
 <zeroOrMore>
  <element>
   <anyName>
    <except>
     <name>極秘</name>
     <name>機密</name>
    </except>
   </anyName>
   <text/> <!-- いかなる要素においても、中身はテキストとする -->
  </element>
 </zeroOrMore>
</element>

属性名においても、同様に制馭が出来ます。

要素の振り分け

記入欄 要素にはいかなる要素も複数個入れられ、中身にはテキストが記入できるとします。また、 記入が無い場合は、 記入無し 要素(空要素)を一つだけ含むようにしたいとします。この場合、 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>
 <記入無し/> <!-- 記入無し 要素以外には、何も入れられない !! -->
</記入欄>

特定の名前空間に属する名前を排除する

例えば、名前空間URI http://www.evil.com/ に属する要素だけを排除し、あとはいかなる要素も入れられるようにするためには、例えば以下のように記述します。

<element name="記入欄">
 <zeroOrMore>
  <element>
   <anyName>
    <except>
     <nsName ns="http://www.evil.com/"/>
    </except>
   </anyName>
   <text/> <!-- いかなる要素においても、中身はテキストとする -->
  </element>
 </zeroOrMore>
</element>

データの排他処理

記述の原則

記述例

例えば、何らかのデータを扱っている中で、未定義のデータ(例えば 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>