Ответ 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
.