2010-03-26 23 views
9

fieldname veya freetext'un her zaman bu XSD'ye uygulanan XML dosyalarında bulunması gerektiğini belirtmek istiyorum. Bunu yapmanın bir yolu var mı?İki şemadan birinin mevcut olması gereken bir XML şemasında nasıl belirtilir?

<xs:complexType name="tSome"> 
<xs:sequence> 
    <!-- either one of the two below has to be present. --> 
    <xs:element name="fieldname" type="xs:string" /> 
    <xs:element name="freetext" type="xs:string" /> 
    <!-- this one below must always be present --> 
    <xs:element name="dbtablename" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
+0

Gerçekten üzgünüm, ama önceki minOccurs etiketleri burada sadece benim seçimimi yaptığım için alan adı ve freetext'in sadece isteğe bağlı olmasıydı. –

cevap

17

Orada bulunan öğelerden birini almasına izin veriyor XML Şeması, bir Choice Indicator olmakla değil iki ya da daha fazla. Eğer 3 herhangi 2 istiyorsanız, ben böyle bir şey yaptığını öneriyorum:

<xs:choice> 
    <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" /> 
</xs:choice> 
<xs:choice> 
    <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" /> 
</xs:choice> 

(. Belki maxOccurs iki kez bir ve aynı eleman seçerken engelleyen) Bu işe yaramazsa, hiçbir şey düşünürler.

Edited: Soruyu ilk kez doğru bir şekilde anlamadım.

<xs:complexType name="tSome"> 
<xs:sequence> 
    <xs:choice> 
    <xs:element name="fieldname" type="xs:string" /> 
    <xs:element name="freetext" type="xs:string" /> 
    </xs:choice> 
    <xs:element name="dbtablename" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
+0

çok teşekkürler! Minoccurs ve maxoccurs'un nasıl çalıştığını öğrenmek için l8r denemeliyim. Örneğiniz, ihtiyaç duyduğum şey olmasa da işe yararsa cevabı kabul ediyorum. şerefe! –

+0

Üzgünüm: hafta sonu oldu: ya alan adı ya da freetext ve ikisi de değil. her zaman dbtablename. Düzenlenmiş orijinal sorumu (neden minOccurs etiketleri vardı) görüyorum. Benim sorum şu: şimdi gerçekten 'ya alan adı ya da freetext ve her ikisi de değil' çünkü minOccurs etiketlerine sahip. Bu yine orig benim hatam. soru ama kaldırılmaları gerektiğini düşünmüyor musunuz? –

+0

@matti MinOccures = "0" hiçbir şey yapmadığı için çıkarılabilirler. –

4

Yani, ya fieldname veya freetext değil de istiyorum: Eğer dbtablename hep fieldname veya freetext herhangi biri ile mevcut olmasını istiyorsanız, o zaman bu cevabı? ya da belki ikisi de? ve daha sonra dbtablename isteğe bağlı olarak?

<xs:choice minOccurs="1" maxOccurs="2"> 
    <xs:element name="fieldname" type="xs:string"/> 
    <xs:element name="freetext" type="xs:string"/> 
    <xs:element name="dbtablename" type="xs:string"/> 
</xs:choice> 

bu İstediğin:

İşte elemanların 1 veya 2'dir? veya dbtablename'un ayrı olmasını mı istiyorsunuz?

+0

Üzgünüm: hafta sonu oldu: ya alan adı ya da freetext. her zaman dbtablename. seçim problemi, xsd.exe bunun için garip kod oluşturmasıdır. –

+0

evet: ya alan adı ya da freetext ve ikisi de değil. –

+0

minOccurs = "1" maxOccurs = "2" ne anlama geliyor? –

İlgili konular