目次へ

6.3 制限

既存の型を基に、新たな型を作成する、もうひとつの方法に制限があります。制限は、型のとりうる値の範囲をさらに制限するものです。例えば、以下のような、PersonNameという名前のComplex Typeの型が存在するとします。

<element name="personName" type="PersonName"/>

<complexType name="PersonName">
 <sequence>
  <element name="title" type="xsd:string" minOccurs="0"/>
  <element name="forename" type="string" minOccurs="0" maxOccurs="unbounded">
  <element name="surname" type="string"/>
 </sequence>
</complexType>

すると、PersonName型のpersonName要素は、以下のようになります。

<personName>
 <title>Mr</title>
 <forename>Taro</forename>
 <surname>Yamada</surname>
</personName>

<personName>
 <forename>Hanako</forename>
 <surname>Suzuki</surname>
<personName>

<personName>
 <forename>Michael</forename>
 <forename>J</forename>
 <surname>Fox</surname>
</personName>

<personName>
 <title>Mr</title>
 <surname>Yamada</surname>
</personName>

PersonName型には、上のような要素の型すべてを満たしています。さて、PersonName型を制限して、新たなComplex Typeを作成するとします。この場合、新たに作成される型の要素は、すべて、基となる型の条件を満たしている必要があります。例えば、制限により、以下のような、title要素が出現しない型を作成することは可能です。

<personName>
 <forename>Hanako</forename>
 <surname>Suzuki</surname>
<personName>

<personName>
 <forename>Michael</forename>
 <forename>J</forename>
 <surname>Fox</surname>
</personName>

これは、PersonName型のtitle要素は、出現してもしなくてもよい要素であるからです。そのため、PersonNameをさらに、「title要素は出現しない」と制限して、新たな型を作ることが可能なのです。逆に、以下のように、surname要素を含まない型を、PersonName型を制限して作ることはできません。

<personName>
 <title> Ms. </title> 
 <forename>Hanako</forename>
<personName>

<personName>
 <forename>Michael</forename>
 <forename>J</forename>
</personName>

これは、PersonName型のsurnameの要素は1回必ず出現するように設定されているからです。これより、上の要素は、PersonName型ではありません。PersonName型でないものをPersonName型を制限して作成することはできないのです。

image

制限により型を作成する場合は、restiriction要素を使用します。

<complexType name="Complex Typeの名前">
<complexContent>
<restriction base="基になるComplex Typeの名前">
要素
属性
</restiriction>
</complexContent>
</complexType>

restriction要素のbase属性に、基になるComplex Typeの名前を記述します。restriction要素の中には、この型に含めたい要素や属性の宣言、および、それらの出現回数や出現順序に関する条件を記述します。以下に例を示します。

<complexType name="SimpleName">
 <complexContent>
  <restriction base="po:PersonName">
   <sequence>
     <element name="forename" type="xsd:string" minOccurs="0" maxOccurs="2">
     <element name="surname" type="xsd:string"/>
   </sequence>
  </restriction>
 </complexContent>
</complexType>

以上のように記述した場合、SimpleName型は、fornameとsurname要素を子供要素にもつような型になります。forename要素の出現回数は、最低0回、最高2回です。surname要素は必ず1回出現します。

さて、上の例のような、制限を使用したComplex Typeの定義をみると、気づくと思います。実は、制限を使用しなくても、定義できます。むしろ、使用しないほうが、すっきり、定義できます。上のSimpleName型を、制限を使用しないで定義すると以下のようになります。

<complexType name="SimpleName">
 <sequence>
     <element name="forename" type="xsd:string" minOccurs="0" maxOccurs="2">
     <element name="surname" type="xsd:string"/>
 </sequence>
</complexType>

既存の型を制限して新たな型を作成する場合でも、すべての要素、属性を記述する必要があるのです。それでは、わざわざ、既存の型を制限して、新たな型を作成する利点というのは何なのでしょうか。それは、XMLパーサによるエラーチェックです。型が正しく制限されていない場合は、XMLパーサはエラーにします。ところが、XML Schemaの勧告に規定している、「制限」の機能は非常に複雑です。よって、今のところ、「制限」の機能を完全に実装しているパーサはなく、きちんとしたエラーチェックができない状態です。さらに、「制限」に関する規定は、非常に難解です。例えば、以下のDerivedTypeはエラーになります。

<complexType name="BaseType">
  <choice>
   <element name="A" type="xsd:string"/>
   <element name="B" type="xsd:string"/>
   <element name="C" type="xsd:string"/>
  </choice>
 </complexType>

<complexType name="DerivedType">
  <complexContent>
    <restiriction base="BaseType">
      <choice>
        <element name="C" type="xsd:string"/>
        <element name="A" type="xsd:string"/>
      </choice>
    </restriction>
<complexContent>

choiceが指定されている型を制限する場合は、基の型の定義の際に要素を記述した順番と同じ順番で、新しい型の内容を記述しなければいけないのです。

いずれにしろ、「制限」を使用して新たなComplexTypeを作成する場合には、慎重に行う必要があります。

6.4 まとめ

  • 既存の型を基にComplex ContentのComplex Typeを作成する場合は、complexContent要素を使用する
  • 既存の型を基にComplex ContentのComplex Typeを作成する方法には、拡張と制限がある
  • 拡張とは、既存の型に要素や属性を追加して新たな肩を作成する方法である
  • 制限とは、既存の型に、要素の出現回数やデフォルト値などの制限を加えて、新たな型を作成する方法である

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp