2010-03-03 5 views
16

Ich versuche, ein einfaches XSD-Auswahlkonstrukt zu erstellen, das entweder eines oder beide der zwei referenzierten Elemente zulässt, aber keines. Das Konstrukt ist ähnlich wie unten, aber ich bekomme immer einen Mehrdeutigkeitsfehler. Was vermisse ich? dieseXSD "ein oder beide" Auswahlkonstrukt führt zu mehrdeutigem Content-Modell

<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> 

Antwort

30

Der übliche Weg, es zu tun ist:

<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

Einige zusätzliche Hinweis, wenn Sie mehrere Elemente verknüpft haben und Sie wollen ein Bündel von Elementen oder das andere Bündel, oder beides, können Sie tun Sie es wie folgt:

<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> 

Nur für den Fall, dass einige von Ihnen stoßen in der gleichen Frage !!

Verwandte Themen