Condividi tramite


Vincolo di attribuzione di particelle univoche

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

In XSD i modelli di contenuto complessi sono soggetti alla regola del vincolo di attribuzione di particelle univoche (UPA, Unique Particle Attribution). Tale regola prevede che ogni elemento in un documento dell'istanza corrisponda in modo non ambiguo a una particella <xsd:element> o <xsd:any> nel relativo modello di contenuto padre. Ogni schema che contiene un tipo con un modello di contenuto potenzialmente ambiguo viene rifiutato.

Le cause di ambiguità più comuni sono la presenza di caratteri jolly <xsd:any> e le particelle con intervalli di occorrenze variabili, ad esempio minOccurs < maxOccurs. Il modello di contenuto seguente, ad esempio, è ambiguo perché un elemento <e1> può corrispondere sia all'elemento <xsd:element> che all'elemento <xsd:any>.

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

Anche il modello di contenuto seguente è ambiguo:

<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>

Mentre un documento come <root><e1/><e2/><e1/></root> può essere convalidato senza ambiguità, questo non è possibile per un documento quale <root><e1/><e1/></root>, perché non è chiaro a quale <xsd:element> faccia riferimento il secondo <e1/>. Anche se alcuni documenti possono essere convalidati senza ambiguità, lo schema verrà rifiutato a causa delle ambiguità potenziali.

Affinché un modello di contenuto sia valido, deve essere possibile convalidare in modo non ambiguo tutte le istanze, senza eseguire ricerche look-ahead. Si consideri, ad esempio, il modello di contenuto seguente.

<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>

Per un documento quale <root><e1/><e3/></root>, la sequenza <e1/><e3/> corrisponde esattamente al secondo elemento <xsd:sequence>. Poiché tuttavia l'elemento <xsd:element> a cui corrisponde <e1/> non può essere determinato senza eseguire ricerche look-ahead a <e3/>, il modello di contenuto viola la regola del vincolo UPA.

Passaggi successivi

Il documento seguente è pubblicato dal World Wide Web Consortium (W3C) e contiene la descrizione tecnica del vincolo di attribuzione di particelle univoche (informazioni in lingua inglese):

"XML Schema Part 1: Structures Second Edition, W3C Proposed Edited Recommendation":

  • Section 3.8.6: Constraints on Model Group Schema Components

  • Appendix H: Analysis of the Unique Particle Attribution Constraint (non-normative)

Per vedere il documento, visitare http://www.w3.org/TR/xmlschema-1.

Vedi anche