Partager via


Contrainte d’attribution de particule unique

Dans XSD, les modèles de contenu complexes sont limités par la règle de contrainte d’attribution de particule unique (UPA). Cette règle exige que chaque élément d’un document d’instance corresponde sans ambiguïté à exactement une particule <xsd:element> ou <xsd:any> du modèle de contenu de son parent. Tout schéma qui contient un type avec un modèle de contenu potentiellement ambigu est rejeté.

Les causes les plus courantes de l’ambiguïté sont <xsd:any> des caractères génériques et des particules qui ont des plages d’occurrences variables, telles que minOccurs < maxOccurs. Par exemple, le modèle de contenu suivant est ambigu, car un <e1> élément peut correspondre à l’élément <xsd:element> ou à l’élément.<xsd:any>

<xsd:element name="root">  
    <xsd:complexType>  
        <xsd:choice>  
            <xsd:element name="e1"/>  
            <xsd:any namespace="##any"/>  
        </xsd:choice>  
    </xsd:complexType>  
</xsd:element>  

Le modèle de contenu suivant est également ambigu :

<xsd:element name="root">  
    <xsd:complexType>  
        <xsd:sequence>  
            <xsd:element name="e1" maxOccurs="2"/>  
            <xsd:element name="e2" minOccurs="0"/>  
            <xsd:element name="e1"/>  
        </xsd:sequence>  
    </xsd:complexType>  
</xsd:element>  

Bien qu’un document tel que <root><e1/><e2/><e1/></root> puisse être validé sans ambiguïté, un document tel que <root><e1/><e1/></root> ne peut pas être validé, car il n’est pas clair à quel <xsd:element> correspond la deuxième <e1/>. Même si certains documents peuvent être validés sans ambiguïté, le schéma sera rejeté en raison du risque d’ambiguïté.

Notez que pour qu’un modèle de contenu soit valide, il doit être possible de valider n’importe quelle instance de manière non ambiguë sans attendre. Par exemple, considérez le modèle de contenu suivant :

<xsd:element name="root">  
    <xsd:complexType>  
        <xsd:choice>  
           <xsd:sequence>  
               <xsd:element name="e1"/>  
               <xsd:element name="e2"/>  
           </xsd:sequence>  
           <xsd:sequence>  
               <xsd:element name="e1"/>  
               <xsd:element name="e3"/>  
           </xsd:sequence>  
       </xsd:choice>  
    </xsd:complexType>  
</xsd:element>  

Pour un document tel que <root><e1/><e3/></root>, la séquence <e1/><e3/> correspond sans ambiguïté au deuxième <xsd:sequence>. Toutefois, étant donné que <xsd:element>, auquel <e1/> correspond, ne peut pas être déterminé sans examiner <e3/>, le modèle de contenu enfreint la règle de contrainte du modèle UPA.

Recherche d’informations supplémentaires

Le document suivant est publié par le World Wide Web Consortium (W3C) et contient la description technique de la contrainte d’attribution de particule unique :

« XML Schema Part 1 : Structures Deuxième Édition, Recommandation modifiée proposée par le W3C »

  • Section 3.8.6 : Contraintes sur les composants de schéma de groupe de modèles

  • Annexe H : Analyse de la contrainte d’attribution de particule unique (non normative)

Pour voir le document, visitez http://www.w3.org/TR/xmlschema-1.

Voir aussi

Collections de schémas XML (SQL Server)