- 6.1 Complex Content
- 6.2 拡張
- 6.3 制限
- 6.4 まとめ
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型を制限して作成することはできないのです。
制限により型を作成する場合は、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を作成する方法には、拡張と制限がある
- 拡張とは、既存の型に要素や属性を追加して新たな肩を作成する方法である
- 制限とは、既存の型に、要素の出現回数やデフォルト値などの制限を加えて、新たな型を作成する方法である