2014-04-16 5 views
5

Wenn ich meinen Code ausführen es gibt mir diesen FehlerXML-Schema: maxOccurs, minOccurs

[ s4s-att-not-allowed: Attribute 'maxOccurs' cannot appear in element 'element'.] 

Hier ist mein Schema:

<xs:element name="parameters" maxOccurs="1" minOccurs="0"> 
    <xs:complexType> 
     <xs:all> 
      <xs:element ref="p ?"/> 
     </xs:all> 
    </xs:complexType> 
</xs:element> 
+2

Das ist nicht Ihr vollständiges Schema. Kontext ist wichtig mit 'minOccurs' und' maxOccurs'. Sie sind mit einer Gruppe verbunden. In welchem ​​Kontext ist Ihr 'xs: element' definiert? Sie können 'top-level' Elemente deklarieren, aber sie können nicht maxOccurs oder minOccurs haben, da sie sich nicht in einem Kontext befinden. Bearbeiten Sie Ihre Frage und fügen Sie den vollständigen Kontext (aus dem Stamm Ihres Schemas) ein. – helderdarocha

+0

Auch 'p?' Ist ungültig als der Wert von 'ref'. Wenn du * eins oder kein * meinst, kannst du '' (du kannst 'maxOccurs = "1" 'weglassen weil es Standard ist) – helderdarocha

+0

Die Sache, an die man sich erinnert, ist, dass jedes XML-Dokument "genau ein einzelnes Wurzelelement" haben kann. Deshalb können Sie im Grunde nicht Max- und Min-Werte für den Stamm angeben - es ist maximal + 1, also nicht erlaubt Sie können beliebige angeben. – rogerdpack

Antwort

4

<xs:element> kann (unter xs:schema auf der obersten Ebene deklariert werden) aber es kann minOccurs oder maxOccurs nicht haben, da das ohne Kontext keinen Sinn macht. Wenn es root ist, kann es nur ein Element haben, wenn nicht, beziehen sich Informationen auf den Kontext des übergeordneten Elements. Das ist legal:

<xs:schema ...> 
    <xs:element name="parameters">...</xs:element> 
    ... 
</xs:schema> 

aber das ist nicht:

<xs:schema ...> 
    <xs:element name="parameters" maxOccurs="1" minOccurs="0">...</xs:element> 
... 
</xs:schema> 

Sie auf eine Top-Level-xs:element innerhalb einer Gruppe wie xs:sequence verweisen. Hier können Sie diese Attribute verwenden, weil Sie jetzt einen Kontext haben (wie viele sind in dieser Gruppe erlaubt). Das ist legal:

<xs:schema ...> 
    <xs:element name="parent"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="parameters" maxOccurs="1" minOccurs="0" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="parameters"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element ref="p" minOccurs="0"/> 
      </xs:all> 
     </xs:complexType> 
    </xs:element> 
    ... 
</xs:schema> 

Hier <parent> der Kontext ist, wo <parameters> auftritt, so kann man sagen, wie oft es dort erlaubt ist. Die Definition von <parameters> ist global und Sie verwenden das Attribut ref, um darauf Bezug zu nehmen.

Wenn Sie noch nie parameters wiederzuverwenden müssen oder wenn Sie nie parameters als root gehen zu müssen, brauchen Sie es nicht auf der obersten Ebene und kann in Ihrem parent Definition Nest es. In diesem Fall können Sie das Attribut name mit minOccurs und maxOccurs verwenden.

<xs:schema ...> 
    <xs:element name="parent"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="parameters" maxOccurs="1" minOccurs="0" /> 
        <xs:complexType> 
          <xs:all> 
           <xs:element ref="p" minOccurs="0"/> 
          </xs:all> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    ... 
</xs:schema> 

Sie können auch auf der obersten Ebene beziehen Typ. Es ist üblicher, Typen wiederzuverwenden, zu erweitern und einzuschränken, so dass dies auch eine gültige (und empfohlene) Möglichkeit ist, um Ihr Element zu definieren:

<xs:schema ...> 
    <xs:element name="parent"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="parameters" type="ParameterType" maxOccurs="1" minOccurs="0" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="ParameterType"> 
     <xs:all> 
      <xs:element ref="p" minOccurs="0"/> 
     </xs:all> 
    </xs:complexType> 
    ... 
</xs:schema> 
Verwandte Themen