2015-11-03 36 views
7

Ho un requisito per uno schema xml che accetta una richiesta con il cliente o con l'id cliente. Se l'ID cliente è 0, allora abbiamo bisogno dei dati del cliente, se è> 0, i dati del cliente sono facoltativi (possono presentare ammende). Al momento, la mia XSD ha questo aspetto;Elementi obbligatori condizionali in un XSD

<xs:complexType> 


    <xs:any> 
     <xs:element name="UserID" type="xs:string" minOccurs="1"/> 
     <xs:element name="Password" type="xs:string" minOccurs="1"/> 
     <xs:element name="ReferenceNumber" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="CustomerId" minOccurs="1" maxOccurs="1" type="xs:integer"/> 
     <xs:element ref="WhereSigned"/> 
     <xs:element name="ContactName" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="ContactTelephone" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="ContactFax" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="ContactEmail" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element ref="MainApplicant" maxOccurs="1"/> 
     <xs:element ref="JointApplicant" minOccurs="0" maxOccurs="1"/> 
     <xs:element ref="Asset" minOccurs="0" maxOccurs="1"/> 
    </xs:any> 


</xs:complexType> 

ho bisogno di qualcosa di un po 'come questo ... (vorrei che fosse questo semplice, ma purtroppo no ..)

<xs:complexType> 
    <xs:choice> 

    <xs:any> 
     <xs:element name="UserID" type="xs:string" minOccurs="1"/> 
     <xs:element name="Password" type="xs:string" minOccurs="1"/> 
     <xs:element name="ReferenceNumber" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="CustomerId" minOccurs="1" maxOccurs="1"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"> 
      <xs:minInclusive value="0"/> 
      <xs:maxInclusive value="0"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
     <xs:element ref="WhereSigned"/> 
     <xs:element name="ContactName" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="ContactTelephone" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="ContactFax" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="ContactEmail" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element ref="MainApplicant" maxOccurs="1"/> 
     <xs:element ref="JointApplicant" minOccurs="0" maxOccurs="1"/> 
     <xs:element ref="Asset" minOccurs="0" maxOccurs="1"/> 
    </xs:any> 

    <xs:any> 
     <xs:element name="UserID" type="xs:string" minOccurs="1"/> 
     <xs:element name="Password" type="xs:string" minOccurs="1"/> 
     <xs:element name="ReferenceNumber" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="CustomerId" minOccurs="1" maxOccurs="1"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"> 
      <xs:minInclusive value="1"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
     <xs:element ref="Asset" minOccurs="0" maxOccurs="1"/> 
    </xs:any> 

    </xs:choice> 
</xs:complexType> 

A nuovi esperti XSD (esistono anche questi ?!) che sono in grado di dare una mano o qualche consiglio?

Molte grazie,

Shaw.

+3

È possibile utilizzare la versione dello schema 1.1? In questo caso, puoi asserzioni - 'xs: assert' (http://www.w3.org/TR/xmlschema11-1/#cAssertions) – potame

+0

Ho esaminato questi e posso vedere che può essere utilizzato per aumentare gli errori dipendenti sul valore degli elementi e dei loro attributi, ma il mio XSD non è abbastanza ottimizzato per essere in grado di vedere come applicare questo alla logica condizionale sulle condizioni dell'elemento ..: s – Shawson

risposta

7

Ciò è possibile in XSD 1.1; di seguito è riportato un esempio semplificato, che presuppone che MainApplicant e WhereSigned siano obbligatori quando CustomerId è uguale a zero.

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xtm="http://paschidev.com/schemas/metadata/xtm"> 
    <xsd:complexType name="Request"> 
     <xsd:all> 
      <xsd:element name="UserID" type="xsd:string" /> 
      <xsd:element name="Password" type="xsd:string" /> 
      <xsd:element name="ReferenceNumber" type="xsd:string" minOccurs="0"/> 
      <xsd:element name="CustomerId" type="xsd:integer"/> 
      <xsd:element ref="WhereSigned" minOccurs="0"/> 
      <xsd:element name="ContactName" type="xsd:string" minOccurs="0" /> 
      <xsd:element name="ContactTelephone" type="xsd:string" minOccurs="0" /> 
      <xsd:element name="ContactFax" type="xsd:string" minOccurs="0" /> 
      <xsd:element name="ContactEmail" type="xsd:string" minOccurs="0" /> 
      <xsd:element ref="MainApplicant" minOccurs="0" /> 
      <xsd:element ref="JointApplicant" minOccurs="0" /> 
      <xsd:element ref="Asset" minOccurs="0" /> 
     </xsd:all> 
     <xsd:assert test="CustomerId[. eq 0] and WhereSigned and MainApplicant or CustomerId[. ne 0]" /> 
    </xsd:complexType> 
    <xsd:element name="Asset"/> 
    <xsd:element name="MainApplicant" /> 
    <xsd:element name="JointApplicant" /> 
    <xsd:element name="WhereSigned" /> 
</xsd:schema> 

XML minima valida, quando CustomerId è zero:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Request"> 
    <UserID>UserID1</UserID> 
    <Password>asodasqZX==</Password> 
    <CustomerId>0</CustomerId> 
    <WhereSigned/> 
    <MainApplicant/> 
</root> 

Quando CustomerId è diverso da zero, allora questo è il XML minimo:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Request"> 
    <UserID>UserID1</UserID> 
    <Password>asodasqZX==</Password> 
    <CustomerId>1</CustomerId> 
</root> 

Il condizionale può essere controllato facilmente (vedi l'espressione @test); aggiungi i vincoli XSD regolari, se necessario (ad esempio se il tuo CustomerId deve essere maggiore o uguale a zero di renderlo nonNegativeInteger, ecc.)

+0

Questo è ESATTAMENTE quello che stavo cercando, grazie! Minore complicazione è che. NET apparentemente non supporta ancora xsd1.1 che ci crediate o no! – Shawson