2014-04-16 8 views
5

Kiedy uruchomić mój kod daje mi ten błądXML Schema: maxOccurs, minOccurs

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

Oto mój schemat:

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

To nie jest twój pełny schemat. Kontekst jest ważny w przypadku 'minOccurs' i' maxOccurs'. Są powiązane z grupą. W jakim kontekście zdefiniowany jest twój "xs: element"? Możesz zadeklarować elementy 'top-level', ale nie mogą one mieć maxOccurs lub minOccurs, ponieważ nie są w kontekście. Edytuj swoje pytanie i wklej pełny kontekst (z katalogu głównego twojego schematu). – helderdarocha

+0

Również 'p?' Jest nieprawidłowe jako wartość 'ref'. Jeśli masz na myśli * jeden lub żaden * możesz użyć '' (możesz pominąć 'maxOccurs =" 1 "' ponieważ jest domyślne) – helderdarocha

+0

Należy pamiętać, że każdy dokument XML może mieć "dokładnie jeden pojedynczy element główny", dlatego zasadniczo nie można podać wartości max i min dla roota - jest to domniemane maksimum + maksimum 1, więc nawet nie pozwala określić dowolne. – rogerdpack

Odpowiedz

4

<xs:element> mogą zostać uznane na najwyższym poziomie (poniżej xs:schema), ale nie może mieć wartości minOccurs ani maxOccurs, ponieważ nie ma to sensu bez kontekstu. Jeśli jest to root, może mieć tylko jeden element, a jeśli nie, to informacja odnosi się do kontekstu elementu nadrzędnego. To jest legalne:

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

ale to nie jest:

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

Można odnoszą na najwyższym poziomie xs:element obrębie grupy, takie jak xs:sequence. Tutaj możesz można użyć tych atrybutów, ponieważ teraz masz kontekst (ile jest dozwolone w tej grupie). To jest legalne:

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

Tutaj <parent> jest kontekst, w którym występuje <parameters>, więc można powiedzieć, ile razy to wolno tam. Definicja <parameters> jest globalna i używasz atrybutu ref, aby się z nim zapoznać.

Jeśli nigdy nie trzeba ponownie użyć parameters lub jeśli nigdy nie będziemy mieć parameters jako root, nie trzeba go na najwyższym poziomie i można zagnieździć go wewnątrz definicji parent. W takim przypadku możesz użyć atrybutu name z minOccurs i 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> 

Można również odwołać się do najwyższego poziomu typu. Częściej jest używać ponownie, rozszerzać i ograniczać typy, więc jest to również prawidłowy (i zalecany) sposób definiowania twojego elementu:

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