Преобразование XSD 1.1 в 1.0 — ошибка проверки

Когда я пытаюсь проверить этот XSD:

<xs:group name="ValidityDateGroup">
    <xs:annotation>
        <xs:documentation>Reusable element group to be used where Valid From/Until needs to be captured in xs:date format</xs:documentation>
    </xs:annotation>
    <xs:all>
        <xs:element minOccurs="0" name="ValidFrom" type="xs:date"/>
        <xs:element minOccurs="0" name="ValidUntil" type="xs:date"/>
    </xs:all>
</xs:group>

<xs:complexType name="NameType">
    <xs:choice maxOccurs="unbounded" minOccurs="0">
        <!-- SNIP - many more choices here -->
        <xs:group ref="ValidityDateGroup"/>  <!-- THIS IS WHERE THE ERROR IS -->
     </xs:choice>
</xs:complexType>

Я получаю следующую ошибку:

Модельная группа «все» должна появиться в частице с «{'минимальное число событий'}» = '{'макс. число событий'}' = 1, и эта частица должна принадлежать к паре, которая составляет '{'тип содержимого'}. ' определения сложного типа.

Единственный способ, которым я смог заставить это работать как XSD 1.0, - это изменить «все» на «последовательность»:

<xs:group name="ValidityDateGroup">
    <xs:annotation>
        <xs:documentation>Reusable element group to be used where Valid From/Until needs to be captured in xs:date format</xs:documentation>
    </xs:annotation>
    <xs:sequence>
        <xs:element minOccurs="0" name="ValidFrom" type="xs:date"/>
        <xs:element minOccurs="0" name="ValidUntil" type="xs:date"/>
    </xs:sequence>
</xs:group>

но это навязывает особый порядок.

У кого-нибудь есть идеи, как заставить этот XSD работать с XSD 1.0?


person David Burstin    schedule 15.06.2015    source источник


Ответы (2)


Вы не можете заставить это работать с XSD 1.0. «Все» не допускается как часть выбора. На самом деле это верно и для 1.1.

Но чего вы на самом деле пытаетесь достичь? У вас есть выбор только с одной ветвью, которая явно избыточна, за исключением того, что она указывает max=unbounded. Ваша группа «все» говорит, что «От» и «До» являются необязательными и могут появляться в любом порядке, а ваша max=unbounded говорит, что группа может появляться любое количество раз. Для меня, если это что-то значит, это означает, что ваш контент может содержать любое количество элементов From и любое количество элементов Until, и они могут располагаться в любом порядке. То есть, значит

<choice maxOccurs="unbounded">
  <element name="From"/>
  <element name="Until"/>
</choice>
person Michael Kay    schedule 15.06.2015
comment
Извините - я недостаточно ясно выразился. Этот XSD исходит из WSDL, который необходимо проанализировать в .NET (поэтому должен быть XSD 1.0). У выбора есть много ветвей - я просто отрезал их, так как они были неактуальны - теперь это исправлено. - person David Burstin; 16.06.2015

Мне удалось получить эту работу на основе ответа Майкла, но обернув выбор в последовательность внутри группы ValidityDateGroup:

<xs:group name="ValidityDateGroup">
    <xs:sequence>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element minOccurs="0" name="ValidFrom" type="xs:date"/>
            <xs:element minOccurs="0" name="ValidUntil" type="xs:date"/>
        </xs:choice>
    </xs:sequence>
</xs:group>

Итак, по словам Майкла, мой контент «может содержать любое количество элементов «От» и «до» в любом порядке». Это также сохраняет группу ValidityDateGroup, которую можно повторно использовать в другом месте.

person David Burstin    schedule 16.06.2015