2013-05-29 9 views
5

Istniejące XSD urywek:Jak dodać walidację warunkowego w 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: Wyliczanie 2 wartości R1 i R2

  • FieldNameType: Wyliczenie 2 wartości F1 i F2

Teraz chcę zmodyfikować ten XSD do zapewnienia poprawności że:

  1. Kiedy RequestType = R1, wtedy nazwy alowed pola są F1 i F2
  2. Kiedy Zapytanie Type = R2, następnie pozostawiono Nazwy pól to F1, F3 i F4. (Może być wymagane nowe wyliczenie)

Jak mogę dodać takie zatwierdzenia? Dzięki.

Odpowiedz

5

Podstawową ideą XSD (i większości innych języków schematów XML) jest powiązanie zachowania walidacyjnego z typami elementów. Jeśli chcesz, aby jeden zestaw instancji zweryfikowano w jeden sposób, a inny zestaw instancji zweryfikowano w inny sposób (idzie za pomysłem), to dowody prima facie świadczą o tym, że w rzeczywistości są to dwa różne typy elementów i powinny mieć dwie odrębne nazwy.

Tak więc najprostszym sposobem, aby XSD zweryfikował twoje żądania, tak jak opisałeś, jest zamiana twojego elementu searchcriteria na parę elementów o nazwach R1 i R2. Zadeklaruj je według różnych typów: każdy z nich ma element o nazwie filter z atrybutem zawierającym odpowiedni typ wyliczeniowy lub R1 jest zadeklarowany jako mający F1 lub F2 jako dziecko, a R2 jest zadeklarowany jako mający wybór F1, F3 lub F4.

Jeśli nie możesz lub nie będzie to zrobić, można użyć XSD 1.1 i jego funkcji przypisania typu warunkowego zadeklarować dwa typy dla searchcriteria (dwóch typów byś inaczej być wykorzystywane do R1 i R2) i przypisać odpowiedni typ na podstawie wartości atrybutu Request. Możesz także użyć asercji na searchcriteria, aby sprawdzić współzacisk.

Jeśli nie masz dostępu do walidatora XSD 1.1, powiedz dostawcy swojego weryfikatora XSD 1.0, że chcesz dokonać aktualizacji, i zbadaj użycie asercji Schematron, aby sprawdzić ograniczenie.

Zobacz także this essentially similar question, aby uzyskać bardziej konkretne omówienie opcji z przykładami.

Powiązane problemy