La spécification SDO nécessite que les groupes de modèles (tous, choix, séquence et références de groupes) soient développés et ne décrit pas les types ni les propriétés.
Pratiquement, cela signifie que toutes les structures qui se trouvent dans les mêmes structures sont "mises à plat". Cette "mise à plat" met tous les enfants de ces structures au même niveau. Ceci peut entraîner des problèmes de noms dupliqués dans un SDO dont la structure est dérivée des données mises à plat. Lorsqu'un XSD ne met pas à plat les groupes, les noms dupliqués contenus par des parents différents restent séparés.
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://MultipleGroup"> <xsd:complexType name="MultipleGroup"> <xsd:sequence> <xsd:choice> <xsd:element name="option1" type="xsd:string"/> <xsd:element name="option2" type="xsd:string"/> </xsd:choice> <xsd:element name="separator" type="xsd:string"/> <xsd:choice> <xsd:element name="option1" type="xsd:string"/> <xsd:element name="option2" type="xsd:string"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:schema>
Les occurrences multiples de option1 et option2 se trouvant dans des blocs de choix distincts, et comportant même un élément de séparation entre eux, le XSD et le XML les distingue sans problème. Mais lorsque le SDO met à plat ces groupes, toutes les propriétés d'option sont maintenant sous le même conteneur de groupe multiple.
Même sans noms dupliqués, la mise à plat de ces groupes entraîne un problème d'ordre sémantique. Par exemple, pour le XSD suivant :
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://SimpleChoice"> <xsd:complexType name="SimpleChoice"> <xsd:sequence> <xsd:choice> <xsd:element name="option1" type="xsd:string"/> <xsd:element name="option2" type="xsd:string"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:schema>
Demander à l'utilisateur de renommer les noms dupliqués ou d'ajouter des annotations spéciales aux XSD n'est pas possible dans beaucoup de cas, comme les schémas de normes ou industriels, car l'utilisateur ne contrôle pas les XSD avec lesquels il travaille.
Pour que toutes les propriétés soient cohérentes, les objets métier incluent une méthode pour accéder à chaque occurrence individuelle des propriétés portant le même nom via la balise XPath. Selon la convention de dénomination EMF, le chiffre non utilisé suivant sera ajouté à tous les noms dupliqués trouvés ; par exemple, le XSD suivant :
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://TieredGroup"> <xsd:complexType name="TieredGroup"> <xsd:sequence> <xsd:choice minOccurs="0"> <xsd:sequence> <xsd:element name="low" minOccurs="1" maxOccurs="1" type="xsd:string"/> <xsd:choice minOccurs="0"> <xsd:element name="width" minOccurs="0" maxOccurs="1" type="xsd:string"/> <xsd:element name="high" minOccurs="0" maxOccurs="1" type="xsd:string"/> </xsd:choice> </xsd:sequence> <xsd:element name="high" minOccurs="1" maxOccurs="1" type="xsd:string"/> <xsd:sequence> <xsd:element name="width" minOccurs="1" maxOccurs="1" type="xsd:string"/> <xsd:element name="high" minOccurs="0" maxOccurs="1" type="xsd:string"/> </xsd:sequence> <xsd:sequence> <xsd:element name="center" minOccurs="1" maxOccurs="1" type="xsd:string"/> <xsd:element name="width" minOccurs="0" maxOccurs="1" type="xsd:string"/> </xsd:sequence> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:schema>
Le XSD précédent produit le modèle d'objet de données suivant :
DataObject - TieredGroup Property[0] - low - string Property[1] - width - string Property[2] - high - string Property[3] - high1 - string Property[4] - width1 - string Property[5] - high2 - string Property[6] - center - string Property[7] - width2 - string
Où width, width1 et width2 sont les noms des propriétés nommées "width" en commençant par la première dans le XSD et ainsi de suite, et de même pour high, high1, high2.
Les nouveaux noms des propriétés sont les noms utilisés pour référence et XPath et n'affectent pas le contenu sérialisé. Les noms "vrais" de chacune de ces propriétés apparaissant dans le XML sérialisé sont les valeurs données dans le XSD. Ainsi, pour l'instance XML :
<?xml version="1.0" encoding="UTF-8"?> <p:TieredGroup xsi:type="p:TieredGroup" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://TieredGroup"> <width>foo</width> <high>bar</high> </p:TieredGroup>
Pour accéder à ces propriétés, vous devez utiliser le code suivant :
DataObject tieredGroup = ... // Affiche "foo" System.out.println(tieredGroup.get("width1")); // Affiche "bar" System.out.println(tieredGroup.get("high2"));