HOPEX UML : HOPEX XML Schemas : Génération XSD : Déclaration d'éléments (XSD)
   
Déclaration d'éléments (XSD)
 
Modélisation des éléments XSD
Clés
Référencer des éléments XSD
Substitution (XSD)
Surcharge dans le cadre de l'héritage par restriction (XSD)
Classes associatives (XSD)
Les types complexes permettent de définir des balises susceptibles de contenir d'autres balises. Un certain nombre de contraintes permettent de préciser :
le nombre de balises d'un type pouvant être contenues (multiplicité)
si l’élément est abstrait
une valeur que doit prendre la balise
etc.
Modélisation des éléments XSD
Les balises contenues dans un type de balises sont déduites des associations composées entre la classe représentant le type contenant (classe composée) et les classes définissant les balises contenues (classes composantes). Les caractéristiques de la déclaration sont supportées par le rôle de l'association du côté du type de balise contenu.
Exemple
<XSD:complexType name="Listedauteurs">
<XSD:element name="Personne" type="Personne"/>
</XSD:complexType>
A partir de l’éditeur de schémas, vous pouvez renseigner sur le rôle les paramètres de génération suivants :
Onglet XSD :
XSD Name : nom de la balise dans le cadre de la génération XSD. S’il n'est pas renseigné, c'est le nom du rôle qui est pris en compte. Dans le cas où le rôle n'a pas de nom, on prend le nom de la classe reliée au rôle.
XSD Id : identifiant de la balise <element>.
XSD BlockExtension, XSD BlockRestriction et XSD BlockSubstitution : ces paramètres permettent de déterminer la valeur de l'attribut "block". La valeur de l'attribut "block" est une combinaison des valeurs "extension", "restriction" et "substitution".
XSD FinalExtension et XSD FinalRestriction : ces paramètres permettent de déterminer la valeur de l'attribut "final". Cette valeur est une combinaison des valeurs "extension" et "restriction".
XSD Form : valeur de l'attribut "form".
XSD Value : renseigne la valeur de l'élément. Ce paramètre est utilisé conjointement avec l'attribut "Modifiable".
Si "Modifiable" = "non", un attribut "fixed" est généré. Sa valeur est correspond au paramètre XSD Value.
Si "Modifiable" = "oui", un attribut "default" prenant cette valeur est généré.
XSD Abstract : valeur de l'attribut "abstract".
XSD Nillable : valeur de l'attribut "nillable".
 
Onglet Caractéristiques :
Multiplicité : renseigne le nombre de fois minimal (attribut "minOccurs") et maximal (attribut "maxOccurs") que peut apparaître la balise dans la balise contenant.
Modifiable : lorsque cet attribut est positionné à "non", il en résulte un attribut "fixed" dans la balise <element> (si toutefois une valeur est donnée au paramètre XSD Value).
Clés
Les clés mettent en œuvre les concepts d'unicité (clé primaire) et de référencement d'un élément.
Dans un document XSD, les clés permettent de spécifier que des éléments d'une balise (par exemple un attribut) doivent avoir la même valeur que des éléments d'une autre balise dans le document instance.
Les clés sont formalisées dans MEGA par des "Contraintes" reliées au rôle de classe. Le nom de la clé générée est copié sur celui de la contrainte. Le contenu de la balise <key> généré est identique au texte contenu dans l'attribut "XSD constraint" de la contrainte. Ce texte contient la définition de la clé et doit être conforme aux spécifications XSD (utilisation des balises <selector> et <field>). Voir "XSD : Les contraintes", page 61.
Parmi les clés on trouve celles qui donnent lieu à la génération de balises :
<unique>
Ce tag est généré à partir d'une contrainte dont le stéréotype est "XSD uniqueness". Cette contrainte signifie qu'il ne peut y avoir deux balises (contenant la clef) dont les éléments définis dans la clé ont la même valeur. Voir "Unicité en XSD", page 61.
<key>
Cette clé a les mêmes propriétés que <unique>. De plus, elle peut servir de référence pour une clé <keyref>. La contrainte représentant cette clé a pour stéréotype "XSD Key". Voir "Clé primaire, Clé étrangère en XSD", page 62.
<keyref>
Il s’agit d’une contrainte de stéréotype "XSD Key Reference". Voir "Clé primaire, Clé étrangère en XSD", page 62.
Référencer des éléments XSD
Il est possible de définir un élément au niveau du schéma. Cet élément peut ensuite être référencé au sein d'une définition de balise. Le but est d'éviter la redondance de définition. Voir "Référence à un élément (Schéma XML)".
Substitution (XSD)
Il est possible de déclarer qu'un élément (dénommé élément tête) peut se substituer à un autre dans le document instance. Il s’agit d’un "substitution group". L'élément substitué doit être déclaré au niveau global.
Pour créer la substitution :
1. Dans le diagramme de classes, créez un élément du type de l'élément tête ou d'un type dérivé.
2. Reliez le rôle de l'élément substituant à l'élément substitué. Il s’agit d’un lien de type "Rôle surchargé".
3. Ouvrez la fenêtre de propriétés du lien.
4. Cliquez sur l’onglet Génération puis le sous-onglet XSD.
5. Dans le champ IsSubstituableTo, sélectionnez "oui".
Surcharge dans le cadre de l'héritage par restriction (XSD)
Lorsqu'un type dérive par restriction, vous pouvez redéfinir des éléments contenus dans le type de base. Vous pouvez par exemple réduire la multiplicité.
Pour surcharger un élément :
1. Dans le diagramme de classes, créez une composition entre le type dérivé et le type de l'élément surchargé.
2. Reliez le rôle représentant l'élément surchargeant à celui surchargé. Il s’agit d’un lien de type "Rôle surchargé".
3. Ouvrez la fenêtre de propriétés du lien.
4. Cliquez sur l’onglet Génération puis le sous-onglet XSD.
5. Dans le champ IsSubstituableTo, sélectionnez "non".
Dans tous les cas, l'élément généré dans le type dérivé aura le même nom que celui surchargé.
Classes associatives (XSD)
Les classes associatives ne sont prises en compte que sur les compositions. Elles permettent de créer des éléments dont le type est étendu par rapport à celui de la classe composante. Ce type étendu n'est valable que dans le cadre de cette relation.
Dans le schéma généré, cela se traduit par la création d'un élément dont le type est dérivé de la classe composante (comme si il existait une généralisation entre la classe composante et la classe associative).
Exemple
<xsd:complexType name="Base" mixed="false">
<xsd:sequence>
<xsd:element name="Elmt" type="Association" minOccurs="0" maxOccurs="unbounded">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="Child">
<xsd:restriction base="xsd:NMTOKENS">
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="Association" abstract="false" mixed="false">
<xsd:simpleContent>
<xsd:extension base="Child">
<xsd:attribute name="att" type="d:number" use="required">
</xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>