2010-03-03 9 views
16

Próbuję wykonać prostą konstrukcję wyboru XSD, która pozwala na jeden lub oba z dwóch elementów, do których się odwołuje, ale nie ma ich wcale. Konstrukt jest podobny do poniższego, ale ciągle pojawia się błąd dwuznaczności. czego mi brakuje?Konstrukcja XSD "jeden lub dwa" prowadzi do niejednoznacznego modelu zawartości

<xs:schema xmlns:xs="..."> 
    <xs:element name="Number" type="xs:integer"/> 
    <xs:element name="Text" type="xs:string"/> 
    <xs:element name="RootStructure"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:choice> 
      <xs:sequence> 
      <xs:element ref="Number"/> 
      <xs:element ref="Text"/> 
      </xs:sequence> 
      <xs:element ref="Number"/> 
      <xs:element ref="Text"/> 
     </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Odpowiedz

30

Zwykłym sposobem, aby to zrobić jest to:

<xs:schema xmlns:xs="..."> 
    <xs:element name="Number" type="xs:integer"/> 
    <xs:element name="Text" type="xs:string"/> 
    <xs:element name="RootStructure"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:choice> 
      <xs:sequence> 
      <xs:element ref="Number"/> 
      <xs:element ref="Text" minOccurs="0"/> 
      </xs:sequence> 
      <xs:element ref="Text"/> 
     </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
0

Niektóre dodatkowa wskazówka, jeśli masz wiele elementów powiązane i chcesz jeden pakiet elementów lub inny pakiet, lub oba, można zrób to tak:

<xsd:complexType name="ComplexTypeName"> 
    <xsd:choice> 
     <xsd:sequence> 
      <xsd:element name="theElement" /> 
      <xsd:element name="theElementIsFlagged" /> 
      <xsd:choice> 
       <xsd:sequence> 
<!-- note the empty sequence block --> 
       </xsd:sequence> 
       <xsd:sequence> 
        <xsd:element name="theOtherElement" /> 
        <xsd:element name="theOtherElementIsFlagged" /> 
       </xsd:sequence> 
      </xsd:choice> 
     </xsd:sequence> 
     <xsd:sequence> 
      <xsd:element name="theOtherElement" /> 
      <xsd:element name="theOtherElementIsFlagged" /> 
     </xsd:sequence> 
    </xsd:choice> 
</xsd:complexType> 

Na wszelki wypadek niektórzy z was wpadną na ten sam problem !!

Powiązane problemy