- 6.1 Complex Content
- 6.2 拡張
- 6.3 制限
- 6.4 まとめ
6.2 拡張
既存の型を基に新たなComplex Typeを定義する方法には、拡張があります。拡張とは、既存のSimple TypeやComplex Typeに子供要素や属性を追加して、新たな型を作成する方法です。
<address> <name>Helen Soe</name> <street>47 Eden Street</street> <city>Cambridge</city> </address> <USaddress> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>old Town</city> <state>PA</state> <zip>95819</zip> </USaddress>
上のaddress要素は、子供要素にname、street、cityを持ちます。下のUSaddress要素は、address要素の3つの子供要素の他に、state要素とzip要素を子供要素にもちます。よって、USaddress要素の型は、address要素の型を拡張することによって、作成することができます。
既存の型を拡張して、新たなComplex Typeを作成する場合は、extension要素を使用します。
<complexType name="Complex Typeの名前"> <complexContent> <extension base="基になるComplex Typeの名前"> 追加する要素 追加する属性 </extension> </complexContent> </complexType>
extension要素のbase属性に、基になるComplex Typeの名前を記述します。
子供要素を追加する場合は、子供要素の出現の順番や出現回数により、choice、sequence、allの要素を使用します。以下に例を示します。
<complexType name="Address"> <sequence> <element name="name" type="xsd:string"/> <element name="street" type="xsd:string"/> <element name="city" type="xsd:string"/> </sequence> </complexType> <complexType name="USAddress"> <complexContent> <extension base="po:Address"> <all> <element name="state" type="xsd:string"/> <element name="zip" type="xsd:integer"/> </all> </extension> </complexContent> </complexType>
上の例では、まず、Addressという名前のComplex Typeを定義しています。Address型は、name、city、streetという子供要素が、この順番で1回ずつ登場するようなComplex Typeです。その後に、USAddressという名前の、Complex Typeを定義しています。USAddress型は、Address型を拡張して作成された、Complex ContentのComplex Typeです。Address 型に、さらにstateとzipという名前の子供要素を追加しています。よって、USAddress型は、name、street、city、state、zipの5つの要素をもつ、Complex Typeになります。
さて、ここで疑問なのが、「これらの要素はどのような順番で登場するのか」ということです。USAddressは、以下のような型であるといえます。
<complexType name="USAddress"> <sequence> <sequence> <element name="name" type="xsd:string"/> <element name="street" type="xsd:string"/> <element name="city" type="xsd:string"/> </sequence> <all> <element name="state" type="xsd:string"/> <element name="zip" type="xsd:integer"/> </all> </sequence> </complexType>
上の赤色の部分は、Address型の定義の中で、子供要素の構造に関する部分をそのまま抜粋しました。黄色の部分は、extension要素内の、子供要素に関する部分を抜粋しました。既存の型に要素を追加して新たな型を作成する場合、新たな型の要素の出現の順番は、上のように、「基の型の要素」が出現した後に、「追加した要素」が出現する形になります。USAddress型の要素USaddressの子供要素は、以下の順番で出現します。
<USaddress> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>old Town</city> <state>PA</state> <zip>95819</zip> </USaddress> <USaddress> <name>Robert Smith</name> <street>8 Oak Avenue</street> <city>old Town</city> <zip>95819</zip> <state>PA</state> </USaddress>
属性を追加するときは、属性宣言か、属性グループによって指定します。追加の方法は、要素と同様です。