XML-схема для сбора компонентов любого определенного типа
Я определил компоненты типов inputTextType
а также inputEmailType
(их определения здесь не важны). Мне нужно иметь components
Коллекция любого числа inputText и / или inputEmail, в любом порядке (например: текст, электронная почта, текст, текст). Я пробовал:
<xs:complexType name="componentsType">
<xs:choice>
<xs:element name="inputText" type="inputTextType" maxOccurs="unbounded" minOccurs="0"/>
<xs:element name="inputEmail" type="inputEmailType" maxOccurs="unbounded" minOccurs="0"/>
</xs:choice>
</xs:complexType>
но тогда при проверке XML
<components>
<inputText>
<label>label 1</label>
<name>as</name>
</inputText>
<inputText>
<label>label 2</label>
<name>ghyyy6</name>
</inputText>
<inputEmail>
<label>drg</label>
<name>rgtght</name>
</inputEmail>
</components>
У меня ошибка cvc-complex-type.2.4.a: Invalid content was found starting with element 'inputEmail'. One of '{inputText}' is expected.
, XML правильный (он мне нужен). Как мне исправить XSD?
Для XML выше я изменил XSD на
<xs:complexType name="componentsType">
<xs:choice>
<xs:element name="inputText" type="inputTextType" maxOccurs="unbounded" minOccurs="0"/>
<xs:element name="inputEmail" type="inputEmailType" maxOccurs="unbounded" minOccurs="0"/>
</xs:choice>
</xs:complexType>
и это сработало, но тогда я не могу определить текст, электронную почту, текст, текст, но только сначала все тексты, а затем все электронные письма.
1 ответ
Решение
Переместить ограничения вхождения до xs:choice
:
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="inputText" type="inputTextType"/>
<xs:element name="inputEmail" type="inputEmailType"/>
</xs:choice>