Type complexe dérivé
Pour le type complexe dérivé, l'élément xsd :complexType doit contenir un élément :
de type xsd :simpleContent pour le contenu purement textuel,
Syntaxe : simpleContent
<!--Contenu textuel -->
<xsd:complexType name="name_type">
<xsd:simpleContent>
<!-- Extension -->
...
</xsd:simpleContent>
</xsd:complexType>
de type xsd :complexContent si le contenu est non textuel pure.
Syntaxe : complexContent
<!-- Contenu pur ou mixte -->
<xsd:complexType name="name_type">
<xsd:complexContent>
<!-- Extension ou restriction -->
...
</xsd:complexContent>
</xsd:complexType>
Restriction d'un type complexe
La restriction d'un type complexe est réalisée par :
Construction d'un nouveau type complexe en supprimant des composants à un type complexe existant,
Comparable à la restriction de types simples : les valeurs du nouveau type constituent un sous-ensemble des valeurs du type de base,
La restriction doit répéter explicitement tous les composants du type de base qui sont conservés.
Exemple : Définition d'un type complexe
<xsd:complexType name="typeContacts">
<xsd:sequence>
<xsd:element name="personne" maxOccurs="unbounded" type="typePersonne"/>
</xsd:sequence>
<xsd:attributeGroup ref="InfosMaj"/>
</xsd:complexType>
Exemple : Définition de type complexe restreint
<xsd:complexType name="typeContactsLimite">
<xsd:complexContent>
<xsd:restriction base="typeContacts">
<xsd:sequence>
<xsd:element name="personne" maxOccurs="50" type="typePersonne"/>
</xsd:sequence>
<xsd:attributeGroup ref="InfosMaj"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
Extension d'un type complexe
Un type complexe dérivé peut être défini par extension d'un type complexe :
Une extension d'un type complexe prend toujours la forme de nouveaux composants ajoutés à la fin du modèle existant.
Un élément de séquence implicite renferme les deux modèles afin de faire respecter la règle selon laquelle tous les modèles ont une seule construction de groupe supérieur.
Ni le type de données d'origine ni le nouveau type de données ne peuvent inclure l'élément xsd :all car il doit toujours se trouver en haut d'un modèle de contenu.
Les deux parties doivent convenir d'autoriser le contenu mixte.
Exemple : Cas : simpleContent
Cet exemple présente le cas d'ajout de deux attributs aux éléments dont le contenu est textuel.
<xsd:element name="bookTitle">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xs:string">
<xsd:attribute name="author" type="xs:string"/>
<xsd:attribute name="isbn" type="xs:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
Exemple : Cas : complexType
Dans cet exemple, on ajoute des éléments ou attributs à type complexe.
<xsd:complexType name="Publication">
<xsd:sequence>
<xsd:element name="Title" type="xsd:string" maxOccurs="unbounded"/>
<xsd:element name="Author" type="xsd:string" maxOccurs="unbounded"/>
<xsd:element name="Date" type="xsd:gYear"/>
</xsd:sequence>
</xsd:complexType >
<xsd:complexType name="BookPublication">
<xsd:complexContent>
<xsd:extension base="Publication">
<xsd:sequence>
<xsd:element name="ISBN" type="xsd:string"/>
<xsd:element name="Publisher" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType >