XSDの複雑な要素
複雑な要素には、他の要素や属性が含まれています。
複雑な要素とは何ですか?
複雑な要素は、他の要素や属性を含むXML要素です。
複雑な要素には次の4種類があります。
- 空の要素
- 他の要素のみを含む要素
- テキストのみを含む要素
- 他の要素とテキストの両方を含む要素
注:これらの各要素には、属性も含まれている場合があります。
複雑な要素の例
空の複雑なXML要素「product」:
<product pid="1345"/>
他の要素のみを含む複雑なXML要素「employee」:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
テキストのみを含む複雑なXML要素「food」:
<food type="dessert">Ice cream</food>
要素とテキストの両方を含む複雑なXML要素「description」:
<description>
It happened on <date lang="norwegian">03.03.99</date> ....
</description>
複雑な要素を定義する方法
この複雑なXML要素「employee」を見てください。これには他の要素のみが含まれています。
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
XMLスキーマで複雑な要素を定義するには、次の2つの方法があります。
1.「employee」要素は、次のように要素に名前を付けることで直接宣言できます。
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
上記の方法を使用する場合、指定された複合型を使用できるのは「employee」要素のみです。子要素「firstname」と「lastname」は、<sequence>インジケーターで囲まれていることに注意してください。これは、子要素が宣言されているのと同じ順序で表示される必要があることを意味します。インジケーターの詳細については、XSDインジケーターの章をご覧ください。
2.「employee」要素は、使用する複合型の名前を参照するtype属性を持つことができます。
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
上記の方法を使用する場合、次のように、複数の要素が同じ複合型を参照できます。
<xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
また、既存の複合型に基づいて複合型を作成し、次のようにいくつかの要素を追加することもできます。
<xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>