2014-04-16 16 views
5

Quando eseguo il mio codice mi dà questo erroreXML-Schema: maxOccurs, minOccurs

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

Ecco il mio schema:

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

Questo non è il tuo schema completo. Il contesto è importante con 'minOccurs' e' maxOccurs'. Sono legati a un gruppo. In quale contesto è definito il tuo 'xs: element'? Puoi dichiarare gli elementi 'top-level', ma non possono avere maxOccurs o minOccurs poiché non si trovano in un contesto. Modifica la tua domanda e incolla il contesto completo (dalla radice dello schema). – helderdarocha

+0

Anche 'p?' Non è valido come valore di 'ref'. Se intendi * uno o nessuno * puoi usare '' (puoi omettere 'maxOccurs =" 1 "' perché è predefinito) – helderdarocha

+0

La cosa da ricordare qui è che ogni documento XML può avere "esattamente un singolo elemento root", ecco perché non puoi sostanzialmente specificare i valori max e min per la root - è implicito max + max di 1, quindi non consente nemmeno tu per specificare qualsiasi. – rogerdpack

risposta

4

<xs:element> possono essere dichiarate al primo livello (di seguito xs:schema) ma non può avere minOccurs o maxOccurs poiché ciò non ha alcun senso senza un contesto. Se è root, può avere solo un elemento, se non lo è, quell'informazione si riferisce al contesto dell'elemento genitore. Questo è legale:

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

ma non è questo:

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

Puoi riferimento ad un livello superiore xs:element all'interno di un gruppo, come xs:sequence. Qui puoi can utilizzare questi attributi perché ora hai un contesto (quanti sono permessi in questo gruppo). Questo è legale:

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

Qui <parent> è il contesto in cui si verifica <parameters>, in modo da poter dire quante volte è permesso in là. La definizione di <parameters> è globale e si utilizza l'attributo ref per fare riferimento ad esso.

Se non avete mai bisogno di riutilizzare parameters o se si sta andando mai avere parameters come root, non è necessario che al primo livello e può nido all'interno della vostra parent definizione. In questo caso è possibile utilizzare l'attributo name con minOccurs e maxOccurs.

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

Si può anche fare riferimento a un livello superiore tipo. È più comune riutilizzare, estendere e limitare i tipi, quindi questo è anche un modo valido (e consigliato) per definire il tuo elemento:

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