5.Simple Content
前章ではSimple Typeについて説明しました。では、属性を持つSimple Typeはどのように定義すればよいのでしょうか。本章では、型の「拡張」について説明したいとおもいます。
- 5.1 Complex Typeの作成
- 5.2 Simple ContentとComplex Content
- 5.3 拡張と制限
- 5.4 Simple Content
- 5.5 まとめ
5.3 拡張と制限
既存の型を基に新たなComplex Typeを定義するには、以下のように記述します。Simple ContentのComplex Typeを作成する場合は、以下のようにsimpleContent要素を使用します。
<complexType name="Complex Typeの名前"> <simpleContent> Complex Typeの内容 </simpleContent> </complexType>
Complex ContentのComplex Type を作成する場合は、complexContent要素を使用します。
<complexType name="Complex Typeの名前"> <complexContent> Complex Typeの内容 </complexContent> </complexType>
以下に例を示します。
<xsd:complexType name="InternationalPriceType"> <simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name=currency type="xsd:string"/> </xsd:extension> </simpleContent> </complexType>
上の例では、InternationalPriceTypeという名前の、Simple ContentのComplex Typeを新たに作成しています。
さて、既存の型を利用して新たなComplex Typeを作成する方法としては、以下の方法があります。
- 既存のComplex Typeを「制限」して作成する方法
例を示します。<personName> <title>Mr</title> <forename>Arnold</forname> <surname>Gore</surname> <personName>
上のpersonNameはComplex Typeです。title、forname、surnameという子供要素をもちます。このpersonNameの型より、fornameとsurnameのみを含むようなComplex Typeを作成することができます。このように、既存のComplex Typeの要素や属性の出現回数などを制限して、新たなComplex Typeを作成することができます。
- 既存の型を「拡張」して作成する方法
例を示します。<internationalPrice currency="EUR">423.46</internationalPrice>
上の例は、Simple Typeの要素に属性を付け加えたものです。このように、既存のSimple TypeやComplex Typeに新たに属性や子供要素を追加して新たな型を作ることができます。
既存の型よりComplex Typeを作成する方法は、非常に複雑で、ルールも難解です。例えば、以下のComplex Typeがあったとします。
<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> </complexType>
ルールが難解なわりに、大きなメリットがあるというわけではありません。よって、以下では「Simple ContentのComplex Typeを定義する方法」つまり、内容にテキストしか含まないが属性を持つ要素の型に限定して、説明します。
5.4 Simple Content
それでは、Simple ContentのComplex Typeを定義する方法について、説明します。これは、Simple Typeの拡張によって作成します。
<complexType name="Complex Typeの名前"> <simpleContent> <extension base="基となSimple Typeの名前"> 追加する属性 </extention> </simpleContent> </complexType>
まず、complexType要素により、新たにComplex Typeを定義することを示します。それに続くのはsimpleContent要素です。これより、既存の型をもとにSimple ContentのComplex Typeを作成します。さらに、extenstion要素により、既存の型を拡張して、新たな型を作成することがわかります。基となる型の名前はbase属性の値に記述されています。
以下に例を示します。
<xsd:complexType name="InternationalPriceType"> <simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name=currency type="xsd:string"/> </xsd:extension> </simpleContent> </complexType>
上の例では、InternationalPriceTypeという新たなComplex Typeを作成しています。Content TypeはSimple Contentです。Simple Typeのdecimalを拡張して、新たな型を作成しています。currency属性を新たに追加しています。
5.5 まとめ
- Complex Typeも、Simple Typeと同様に、既存の型を基に作成することができる
- Complex Typeには、Simple ContentとComplex Contentがある
- 既存の型を基に新たなComplex Typeを作成する方法には、拡張と制限がある。
- 内容に文字列しか持たないが、属性を持つComplex Typeを作成する場合、既存のSimple Typeを拡張
- する。