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>
Другие вопросы по тегам