2009-08-20 17 views
13

XML dosyasındaki bir öğenin XSD'de iki farklı türde olabileceği bir durum var.xsd aynı eleman, farklı türleri?

Yapmak istediğim, önce girilen değeri daha katı bir biçimde doğrulamak (eğer formu dolduran bir kişi ise) ve eğer bu çekilemiyorsa, daha az sıkı olana doğrulayın. Bu, formu dolduran bir kuruluştur), aksi takdirde doğrulama yapılmazsa doğrulama başarısız olur.

Yani bu temelde öyle:

<xsd:complexType name="ForminfoType"> ` 
    <xsd:sequence> 
     <xsd:element name="formname" type="xsd:string" /> 
     <xsd:element name="timestamp" type="xsd:dateTime" /> 
     <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
     <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
     <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
    </xsd:sequence> 
</xsd:complexType> 

Ne PersonType beyan temelde belirli bir desene göre inşa edilmiş 12 basamaklı numaradır. Organizasyon türünün beyan ettiği şey temel olarak sadece 10 basamaklı bir sayıdır. dizisi içine

<xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 

ama aynı ad ve farklı türde iki öğesinin olamaz:

Yani mantıken yapmak istiyorum bu ne koymaktır. Bu yüzden başka bir şekilde çözmem gerektiğini düşünüyorum. Bulduğum ne

oldu bu: hemen hemen yapmak istediğim budur, ama bunun mümkün olduğundan emin değilim http://xsd.stylusstudio.com/2007Oct/post05003.htm

. Bunu çözmek için başka herhangi bir fikri olan var mı?

Şimdiden teşekkürler.

+2

Sen kod çoklu hatlar için komutu ters tırnak kullanmak istemiyoruz. Sadece hatları seçin ve Control-K kullanın. –

+1

@Arizon: Kodu doğru biçimlendirmek için, vurgulayın ve daha sonra editörün üstündeki araç çubuğundaki sıfırlar ve tuşlarla (01010 0101010) düğmesine tıklayın! –

cevap

11

Hayır, bunu gerçekten yapamazsınız.

<xsd:complexType name="PersonOrOrgType"> 
    <xsd:choice> 
     <xsd:element minOccurs="0" name="PersonSender" type="PersonType" /> 
     <xsd:element minOccurs="0" name="OrgSender" type="OrganizationType" /> 
    </xsd:choice> 
    </xsd:complexType> 

ve ardından "gönderen" bu tür bir örnek olun:: Tek seçenek o çizgisinde bir "PersonOrOrgSender" karmaşık türü oluşturmak zorunda

<xsd:element name="sender" type="PersonOrOrgType" minOccurs="0" /> 

ama o zaman olacak

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <OrgSender> 
     <Name>string</Name> 
    </OrgSender> 
    </sender> 
    ... 
</FormInfo> 

veya

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <PersonSender> 
     <Name>string</Name> 
    </PersonSender> 
    </sender> 
    ... 
</FormInfo> 
: böyle XML veri var

Tek bir etiket yapamazsınız (ör. "gönderici"), bir durumda ve başka bir durumda başka bir şey olabilir - bir etiket tam olarak iyi tanımlanmış bir türe sahip olmalı ve bu türün bir kez ve her zaman için sahip olması gerekir. @mark_s tarafından sağlanan solüsyon ile

Marc

+0

Marc, Çok teşekkür ederim, maalesef başka bir soruna rastladım, Gönderici öğesinin bir çocuk düğümü olmasına izin verilmedi, bu yüzden PersonType'a bir "veya" ve organizasyon kalıbı ekleyerek çözdüm. "| [0-9] {10}" Saygılarımızla, Erik –

1

Verilen sorunlarınızın, birkaç seçeneğiniz vardır:

  • sender için iki tip iki ayrı XSD'ler oluşturun. Doğrulamayı tetikleyen kodunuzda bunları sırayla çalıştırın (yani kişi veya kuruluş). Bu, kodunuzun hangi geçerliliğin geçtiğini bilmesi için ek bir yarar sağlar (ve bu bilgiye dayanarak seçimler yapabilir).
  • Seçimi XSD içindeki bir seviyeye taşıyın. İçinde ForminfoType, iki diziye (bir kişi, bir kuruluş) sahip bir seçim düğümü ekleyin.Kabaca valide ama henüz:

    <xsd:complexType name="ForminfoType"> 
        <xsd:choice> 
         <xsd:sequence> <!-- person --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
         <xsd:sequence> <!-- organization --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
        </xsd:choice> 
    </xsd:complexType>