2009-04-23 15 views
17
Ben <key> alt öğesi olmalıdır bir <property> elemanı için bir şema oluşturmak çalışıyorum

ve <val> biri <shell> veya <perl> ve isteğe bağlı <os> veya <condition> ve önemli değildir alt öğelerin sırası . Bunun için <xs:all> kullanarak düşünce, İdealXML Şeması: Neden <xs:all><choice> çocuğa sahip olamaz? ve bu nasıl atlanabilir?

<property> 
    <key>A</key> 
    <val>b</val> 
</property> 

<property> 
    <key>A</key> 
    <val>b</val> 
    <os>Windows</os> 
</property> 

<property> 
    <condition>a == 1</condition> 
    <key>A</key> 
    <perl>1+1</perl> 
    <os>unix</os> 
</property> 

: Burada

geçerli <property> elementler için bazı örnek vardır

<xs:element name="property"> 
    <xs:complexType> 
    <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:choice> 
     <xs:element name="val" type="xs:string" /> 
     <xs:element name="perl" type="xs:string" /> 
     <xs:element name="shell" type="xs:string" /> 
     </xs:choice> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
    </xs:all> 
    </xs:complexType> 
</xs:element> 

Ama <xs:all> içerebilir öğrendim sadece <xs:element> değil <xs:choice> . Birisi neden olduğunu açıklayabilir mi?

Daha önemlisi, birisi böyle bir <property> öğesinin doğrulanması için bir yol sağlayabilir mi? <xs:all> opsiyonel elemanlar olarak, ama şema üç sadece ve sadece bir eleman var olduğunu doğrulamak istiyorum - <val>, <perl> ve <shell> -

Üç elemanları koyabilirsiniz. Bu yapılabilir mi? (Xmllint ile test) seçim için ikame grupları kullanarak ilgili Newt yorum dayanarak

+1

@splintor: Sorunuzu yazarken gerçekten önizleme penceresine baktınız mı? Demek istediğim, bunun yarısı görünmezdi ... – Tomalak

+0

Hem os hem de durumun aynı özellik öğesinde ya da birinin ya da diğerinin içinde meydana gelebileceğini mi, yoksa ne meydana gelebileceğini mi kastediyorsun? –

+0

@Tomalak: Hayır - Önizleme penceresini kaçırdım. Ne istediğimi ifade etmek için düzenlediğiniz için çok teşekkürler. – splintor

cevap

22

, "seçim" olarak şimdi kendi unsurdur (typeFacet), ancak soyut olduğu gibi doğrudan kullanılamaz.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="property"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:element ref="typeFacet" /> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="typeFacet" abstract="true" /> 
    <xs:element name="val" type="xs:string" substitutionGroup="typeFacet" /> 
    <xs:element name="perl" type="xs:string" substitutionGroup="typeFacet" /> 
    <xs:element name="shell" type="xs:string" substitutionGroup="typeFacet" /> 
</xs:schema> 
+0

Evet, bu bir gelişme. – 13ren

+0

Evet, tam olarak ne demek istediğimi tam olarak anlattım ama aslında yapacak bir şeyle karşılaşmadım. Soyutlama da burada kesinlikle iyi bir fikir. –

+0

Harika, XSD şemasında yer değiştirmeyi bilmiyordum. Bu ihtiyacım olanı yapıyor gibi görünüyor. Teşekkürler. – splintor

6

:

Bu durumun biraz daha iyi olduğunu düşünüyorum
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="property"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:element ref="val"/> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="val" type="xs:string"/> 
    <xs:element name="perl" type="xs:string" substitutionGroup="val" /> 
    <xs:element name="shell" type="xs:string" substitutionGroup="val" /> 
</xs:schema> 
+0

Harika, XSD şemasındaki ikameyi bilmiyordum. Bu ihtiyacım olanı yapıyor gibi görünüyor. Teşekkürler. – splintor

İlgili konular