2010-01-15 9 views
5

Czy możliwe jest zdefiniowanie w XSD następujący scenariusz:XML Schema - elementy podrzędne zależne od istnienia opcjonalnego atrybutu

  1. Element nadrzędny posiada atrybut

    jest opcjonalne.

  2. Jeżeli cecha nie jest

    present in XML, at least one child 
    
    element must exists. 
    
  3. Jeżeli

    attribute is present, there can be 
    
    zero or more child elements. 
    

przykład:

NIEWAŻNE

<parent externel-source="some_name" /> 



<parent externel-source="some_name"> 

    <child>some value</child> 

</parent> 



<parent> 

    <child> some value</child> 

</parent> 

nieprawidłowy

<parent /> 

Odpowiedz

-1

No nie sądzę.

+0

Odpowiedzi takiego typu nie są zadowalające dla mnie. Jakie jest uzasadnienie twojego stwierdzenia? –

+2

Schematy XML są bardzo podobne do twoich typów programowania OO. Można utworzyć typ złożony i można ograniczyć kolejność elementów typu elementu i atrybutu oraz ograniczenia dotyczące rodzaju wartości, które można przypisać. To wszystko Xsd może zrobić dla ciebie. To, czego chcesz, to coś w rodzaju ograniczenia, które obejmuje więcej niż jeden element/atrybut, co po prostu nie jest możliwe w przypadku xsd. musisz napisać swój własny kod, aby to potwierdzić. – affan

+0

Też myślę, że to nie jest możliwe, i że powiedzenie tego jest całkiem dobrą odpowiedzią (jeśli jest poprawna) :-) –

3

Nie. Powód jest następujący: w twoim przypadku próbujesz sprawdzić obecność elementu/tagu w zależności od wartości jakiegoś innego tagu/atrybutu .. (XSD jest w zasadzie zbiorem deklaracji), który wymaga wielu deklaracja samego elementu ..
Multiple deklaracja samego elementu nie jest dozwolone w XSD .. :-(
Zapoznaj się z similar problem (click here) zamieszczonych przez członka StackOverflow

0

Niestety wskrzesić tę wiadomość, ale myślałem, Mógłbym dodać trochę "dlaczego" rzeczy.W3C XML Schema wymaga, aby wszystkie jego sekwencje były w pełni deterministyczne. Z powodów wydajności/prostoty, nie jest przeznaczony do patrzenia w przyszłość lub patrzenia wstecz, tylko działa na bieżącym elemencie. Wierzę również, że jest to dziedziczone z SGML.

To, co chcesz zrobić, wymaga takiej funkcjonalności. Możesz spojrzeć na Schematron; obsługuje to, co chcesz.

0

Tak, zdecydowanie można, używając xsi: type (co prawdopodobnie nie jest tym, czego potrzebujesz!). Np. Z XSD poniżej;

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<xs:element name="data"> 
    <xs:complexType> 
     <xs:choice> 
      <xs:element ref="elemParent" minOccurs="1" maxOccurs="unbounded"/> 
     </xs:choice> 
    </xs:complexType> 
</xs:element> 
<xs:element name="elemParent" type="ctBase"></xs:element> 
<xs:complexType name="ctNoAttChildReq"> 
    <xs:complexContent> 
     <xs:extension base="ctBase"> 
      <xs:sequence> 
       <xs:element name="elemKid" type="xs:string"></xs:element> 
       <xs:element name="elemKidAdditional" type="xs:string" minOccurs="0"></xs:element> 
      </xs:sequence>    
     </xs:extension> 
    </xs:complexContent>  
</xs:complexType> 
<xs:complexType name="ctAttNoChild"> 
    <xs:complexContent> 
     <xs:extension base="ctBase"> 
      <xs:attribute name="attReq" use="required"/> 
     </xs:extension> 
    </xs:complexContent>   
</xs:complexType>  
<xs:complexType name="ctBase" abstract="true"> 
    <xs:sequence/> 
</xs:complexType>  

masz instancji, który albo atrybut lub jedno lub więcej dzieci, ale trzeba mieć XSI: Wprowadź instancji, które mogą lub nie mogą być show-korek.

<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Xsds/StackOverflow_2070316_WIP.xsd"> 
<elemParent attReq="Yo!" xsi:type="ctAttNoChild"/> 
<elemParent xsi:type="ctNoAttChildReq"> 
    <elemKid>Adam</elemKid> 
</elemParent> 
<elemParent xsi:type="ctNoAttChildReq"> 
    <elemKid>Eve</elemKid> 
    <elemKidAdditional>Sid</elemKidAdditional> 
</elemParent>