XML-схема: выбор и minOccurs

В этом примере ниже

        <xs:complexType>
        <xs:choice minOccurs="3" maxOccurs="unbounded">
            <xs:element ref="Start"/>
            <xs:element ref="Center"/>
            <xs:element ref="End"/>
            <xs:element ref="PI" minOccurs="0"/>
            <xs:element ref="Feature" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
        </xs:complexType>

Что происходит, когда у выбора есть minOccurs > 1? Означает ли это, что элемент "Пуск" может произойти 3 раза?

Ответ 1

Что происходит, когда у выбора есть minOccurs > 1? Означает ли это, что элемент "Пуск" может произойти 3 раза?

Да <Start> может появиться 3 или более раз! Имея minOccurs выбора более чем 1, позволяет несколько элементов появляться более одного раза, или несколько элементов появляются несколько раз.

Подробное объяснение: В приведенном выше примере вы применили minOccurs как 3 для <Choice> и maxOccurs как неограниченный! Это означает, что.. Детские элементы, перечисленные в разделе <Choice>, любые три из них или любой тэг, повторяемый три раза, должны появляться под их родителями! Примеры XML приведены ниже:

Предположим, что этот набор тегов появляется под node, называемым <parent>, а затем:

  <parent>
    <Start>Start1</Start>
    <Center>Center1</Center>
    <End>End1</End>
  </parent>

-------- ИЛИ --------

  <parent>
    <Center>Start1</Center>
    <Center>Center1</Center>
    <Feature>End1</Feature>
  </parent>

-------- ИЛИ --------

 <parent>
    <Start>Start1</Start>
    <Start>Start1</Start>
    <Start>Start1</Start>
    <Start>Start1</Start>
  </parent>

все приведенные выше комбинации действительны!

НО вы также определили minOccurs = "0" для "PI" и "Feature".

Это добавление заставляет Validator передавать родительский элемент без дочерних элементов., т.е.

  <parent>
  </parent>

Если вы удалите minOccurs из этих двух элементов, то проверка заставляет вас включать минимум 3 тега для включения в родительский.

Также наличие maxOccurs="unbounded" для Feature Элемента бесполезно! Поведение не изменится, если вы его добавите или снимите.

Ответ 2

В читаемом regexp-подобном синтаксисе, а не в подробных массах заостренных скобок, вы

(Start | Center | End | PI? | Feature *) {3,}

что означает что-либо внутри круглых скобок 3 или более раз, и каждый раз он не должен быть одним и тем же элементом. Учитывая, что существуют варианты с нулевым значением - PI? и Feature * - среди вариантов, все выражение также равно нулю, что означает, что любое количество нулей, включая ноль, также будет удовлетворять ограничениям.

Чтобы ответить на ваш конкретный вопрос, да, "Пуск" может состоять из трех (или более раз). Это может произойти любое количество раз, по сути.