Подтвердить что ты не робот

Должны ли границы возникновения XSD быть в последовательности или элементе?

Если у меня есть элемент с одним или несколькими подэлементами, должны ли атрибуты min/maxoccurs быть в элементе xsd: sequence, в элементе xsd: both или none?

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence minOccurs="1" maxOccurs="unbounded"> <!-- here? -->
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/> <!-- or here? -->
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
4b9b3361

Ответ 1

Практически во всех случаях вы хотите поместить min/max на элемент в последовательности, а не в последовательности. Используя ваш пример:

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

Это недвусмысленно. Если у вас есть ряд элементов книги в строке, вы можете указать, какой именно элемент схемы производит их. Однако:

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence minOccurs="1" maxOccurs="unbounded"/>
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

Здесь, если у вас есть два элемента "book" в строке, есть ли у вас два sequence в строке или один sequence с двумя элементами book? Это не соответствует требованиям Unique Particle Attribution.

Наконец, если вы поместите min/max Происходит в последовательности, и позже вы добавите дополнительный элемент:

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence minOccurs="1" maxOccurs="unbounded"/>
      <xsd:element ref="book"/>
      <xsd:element ref="ebook"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

то это может позволить следующий XML, который, вероятно, не тот, который вы намереваетесь:

<books>
  <book/><ebook/><book/><ebook/><book/><ebook/><book/><ebook/>
</books>

тогда как если у вас есть:

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence/>
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/>
      <xsd:element ref="ebook" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

тогда ясно и однозначно, что вы намереваетесь: последовательность из одного или нескольких элементов book, за которыми следует последовательность из одного или нескольких элементов ebook.

Ответ 2

Он должен быть на <xsd:element>, IMHO.

Эффект поместить его в последовательность один и тот же, в конце концов (для этого случая). Но, глядя на это с логической точки зрения, вы хотите выразить, что это последовательность элементов, а не строка последовательностей, содержащая по одному элементу.

Положив это на оба, я определенно буду чувствовать себя не так, хотя для этого случая он (опять же) не будет иметь практических различий.

Ответ 3

Поместите атрибут maxOccurs в элемент < xsd: element > .

<xsd:sequence>
  <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/> <!-- here! -->
</xsd:sequence>