目次へ

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>

属性を追加するときは、属性宣言か、属性グループによって指定します。追加の方法は、要素と同様です。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp