2013-05-29 15 views
5

esistente XSD Snippet:Come aggiungere la convalida condizionale in XSD:

<xs:element name="searchcriteria"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="filter" 
        minOccurs="0" 
        maxOccurs="unbounded" /> 
    </xs:sequence> 
    <xs:attribute name="Request" 
        type="RequestType" /> 
    </xs:complexType> 
</xs:element> 


<xs:element name="filter"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="filter" 
        minOccurs="0" 
        maxOccurs="unbounded" /> 
    </xs:sequence> 
    <xs:attribute name="FieldName" 
        type="FieldNameType" /> 
    </xs:complexType> 
</xs:element> 

...

  • RequestType: Conteggio di 2 valori R1 e R2

  • FieldNameType: Enumerazione di 2 valori F1 e F2

Ora voglio modificare questo XSD per fornire una convalida che:

  1. Quando RequestType = R1, quindi i nomi alowed campi sono F1 e F2
  2. Quando Request Type = R2, poi lasciato I nomi dei campi sono F1, F3 e F4. (Potrebbe essere necessaria una nuova enumerazione)

Come posso aggiungere tali convalide? Grazie.

risposta

5

L'idea di base di XSD (e della maggior parte degli altri linguaggi dello schema XML) è di associare il comportamento di convalida ai tipi di elementi. Se si desidera che un gruppo di istanze convalidato in un modo e un altro insieme di istanze convalidate in un altro modo (l'idea), è prima prova evidente che si tratta in realtà di due distinti tipi di elementi e che dovrebbero avere due nomi distinti.

Quindi il modo più semplice per rendere XSD convalidare le richieste come descritto è sostituire l'elemento searchcriteria con una coppia di elementi denominati R1 e R2. Dichiarali con tipi diversi, come preferisci: o hanno un elemento chiamato filter con un attributo che porta un tipo enumerato appropriato, oppure R1 è dichiarato come uno F1 o F2 come figlio e R2 viene dichiarato come avente un scelta di F1, F3 o F4.

Se non è possibile o non vogliono fare questo, è possibile utilizzare XSD 1.1 e la sua funzione di assegnazione del tipo di condizionale per dichiarare due tipi di searchcriteria (i due tipi che altrimenti avete usato per R1 e R2) e assegnare la tipo appropriato in base al valore dell'attributo Request. È inoltre possibile utilizzare asserzioni su searchcriteria per verificare il co-vincolo.

Se non si ha accesso a un validatore XSD 1.1, comunicare al fornitore del validatore XSD 1.0 che si desidera un aggiornamento ed esplorare l'utilizzo delle asserzioni Schematron per verificare il vincolo.

Vedere anche this essentially similar question per una discussione più concreta delle opzioni, con esempi.

Problemi correlati