XSD

2015-11-03 22 views
7

için koşullu zorunlu öğeler Bir müşteriye veya müşteri kimliğine sahip bir isteği kabul eden bir xml şemasına ihtiyacım var. Müşteri Kimliği 0 ise, müşteri verisine ihtiyacımız var, eğer> 0 ise, müşteri verileri isteğe bağlıdır (Değişiklikler gönderebilir). XSD'm şu an böyle görünüyor; 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> 

I (Ben bu basit ama ne yazık ki değildi istedikleri ..) ... biraz böyle bir şey gerekiyor

<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 ny XSD uzmanları (bunlar var mıdır ?!) kim bir el ya da tavsiye verebilir?

Çok teşekkürler,

Shaw.

+3

Şema sürüm 1.1 kullanımına izin veriliyor mu? Bu durumda, iddiaları yapabilirsiniz - xs: assert (http://www.w3.org/TR/xmlschema11-1/#cAssertions) – potame

+0

Bunları inceledim ve hataları bağımlı olarak kullanabileceğimizi görebiliyorum. elementlerin ve niteliklerinin değerine göre, ancak XSD'm, öğenin koşullarına mantıksal mantığa nasıl uygulanacağını görecek kadar iyi değildir.: s – Shawson

cevap

7

Bu XSD 1.1'de mümkündür; aşağıda, ClientId sıfıra eşit olduğunda, MainApplicant ve WhereSigned öğelerinin zorunlu olduğunu varsayan basitleştirilmiş bir örnektir.

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

Asgari geçerli XML, CustomerId sıfırdır:

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

koşullu kolaylıkla kontrol edilebilir: CustomerId olmayan sıfır olduğunda

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

, o zaman bu asgari XML'dir (@ test ifadesine bakın); gerektiği gibi düzenli XSD kısıtlamaları ekleyin (ör. CustomerId uygulamanızın, NegativeInteger değil, sıfırdan büyük veya sıfıra eşit olması gerekiyorsa)

+0

Bu, tam olarak ne aradığımı, teşekkür ederim! Küçük bir komplikasyondur. Net, görünüşe göre xsd1.1'i desteklemiyor ya da desteklemiyor! – Shawson