Пользователь Jörn Horstmann фактически уже правильно ответил на ваш вопрос, но форматирование может сделать ответ немного неясным. Я надеюсь, что эти примеры помогут тем, кого оставили озадаченными.
Что означают minOccurs
и maxOccurs
для <xs:all>
элемента
Помните, что <xs:all>
и <xs:element>
имеют значение по умолчанию "1" для minOccurs
и maxOccurs
. Поэтому
<xs:all>
<xs:element type="xs:int" name="int-attr"/>
<xs:element type="xs:string" name="str-attr"/>
</xs:all>
Фактически совпадает с
<xs:all minOccurs="1" maxOccurs="1">
<xs:element type="xs:int" name="int-attr" minOccurs="1" maxOccurs="1"/>
<xs:element type="xs:string" name="str-attr" minOccurs="1" maxOccurs="1"/>
</xs:all>
Это означает, что вся группа <xs:all>
является обязательной, а также оба элемента, определенные в ней, - порядок свободен. Таким образом, XML-документ
<parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.example.com/xml/schemas">
<int-attr>12</int-attr>
</parent>
будет недействительным. Использование атрибута minOccurs="0"
для <xs:all>
означает, что вся группа является необязательной, и в этом случае она также допускает пустой элемент <parent/>
. Я вижу, что это то, что на самом деле означает спецификация: «Все элементы в группе могут появляться один раз или не появляться вообще». Я не являюсь носителем английского языка, но я бы также сказал, что второй пример на странице w3schools неверен. Он должен читать «, оба элемента МОГУТ появляться ноль или один раз» вместо « каждый элемент МОЖЕТ появляться ноль или один раз».
maxOccurs
атрибут <xs:all>
равен фиксированным значением «1» .
Как определить тег, который имеет ноль или один из каждого дочернего тега
Так вот, что вы спросили в своем комментарии и что вы пытались проверить в первую очередь. Дополнительные элементы внутри группы <xs:all>
достигаются путем добавления атрибута minOccurs="0"
к этим элементам. Пример ниже
<xs:all minOccurs="1" maxOccurs="1">
<xs:element type="xs:int" name="int-attr" minOccurs="0" maxOccurs="1"/>
<xs:element type="xs:string" name="str-attr" minOccurs="0" maxOccurs="1"/>
</xs:all>
Эта схема будет проверять документ XML
<parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.example.com/xml/schemas">
<int-attr>12</int-attr>
</parent>
Поскольку оба элемента являются необязательными (поскольку они имеют minOccurs="0"
), это определение также допускает пустой элемент <parent/>
. Хотя ограничение количества элементов в некотором смысле «переопределяет» значение, установленное на <xs:all>
, в спецификации также говорится: «Ни один элемент в модели содержимого не может появляться более одного раза, т.е. допустимые значения minOccurs и maxOccurs равны 0 и 1» , Таким образом, у вас не может быть группы, которая имеет несколько одинаковых элементов в случайном порядке, или, по крайней мере, вы не можете использовать <xs:all>
для создания такого типа.