Вы не можете сделать это точно. Ошибка в том, что простой валидатор, который видит элемент <category>
, не сразу узнает, какую ветку выбрать, и XML Schema 1.0 поддерживает такие простые валидаторы.
В качестве альтернативы можно назвать каждый элемент в соответствии с категорией.
<xs:element name="datatype">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="simpleCategory" type="empty"/>
<!-- some fields specific for SIMPLE -->
</xs:sequence>
<xs:sequence>
<xs:element name="complexCategory" type="empty"/>
<!-- some fields specific for COMPLEX -->
</xs:sequence>
<xs:sequence>
<xs:element name="collectionCategory" type="empty"/>
<!-- some fields specific for COLLECTION -->
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
где empty
определяется как пустой тип. Или дайте им сложные типы для хранения «определенных полей». Существуют и другие альтернативы в зависимости от ваших ограничений, например, использование групп подстановки или производных сложных типов.
В целом, XML Schema 1.0 не подходит для ограничений, основанных на взаимосвязанных значениях. Для этого вам нужно перейти к XML-схеме 1.1 или внешнему инструменту.