Кратко
- Документ действителен, потому что элементы имеют
minOccurs="0"
.
- Используйте
<xs:choice>
вместо <xs:sequence>
.
Немного более длинный ответ.
Точно так же, как @Damien сказал, что XML допустим, потому что эта часть вашей схемы допускает «пустые» последовательности.
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="or" type="filterGroupOrType" minOccurs="0"/>
<xs:element name="filterElement" type="filterType" minOccurs="0"/>
</xs:sequence>
С помощью <xs:sequence minOccurs="2" maxOccurs="unbounded">
Вы определяете, что «эта последовательность должна появляться как минимум дважды». В то же время <xs:element name="or" type="filterGroupOrType" minOccurs="0"/>
Позволяет этим элементам в последовательности отсутствовать. Метафорически это все равно, что сказать: «Вы должны заказывать еду дважды, но вам не нужно есть то, что вы заказали».
Вместо этого, если вы хотите всегда иметь как минимум 2 дочерних элемента, и эти дочерние элементы могут быть <filterElement>
или <or>
элементами в любом порядке, вы должны использовать <xs:choice>
с minOccurs="1"
<xs:choice minOccurs="2" maxOccurs="unbounded">
<xs:element name="or" type="filterGroupOrType" minOccurs="1"/>
<xs:element name="filterElement" type="filterType" minOccurs="1"/>
</xs:choice>
Значение по умолчанию для minOccurs
равно 1, так что вы можете оставить его и сохранить свой код чище и короче. <xs:choice>
выбирает одного из его дочерних элементов и повторяет выбор не менее minOccurs
раз. Если хотя бы один из вариантов может иметь minOccurs="0"
, тогда выбор также разрешит "пустой" выбор.