XSD 2 элемента один раз, 1 элемент 1+ в любом порядке - PullRequest
0 голосов
/ 06 мая 2018

Я работаю над схемой XML, которая включает в себя 3 элемента, которые могут быть в любом порядке .

  • Два из них должны появиться ровно один раз ,
  • Третий элемент может появляться один раз или более одного раза .
  • Все три обязательны.

В приведенном ниже примере каждая биография имеет ОДИН favoriteColor и ОДИН favoriteNumber, И МЕНЬШЕ ОДИН comment. Я бы хотел, чтобы их разрешали в любом порядке (включая чередование).

<xs:element name="bio">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="favoriteColor" maxOccurs="1" minOccurs="1"/>
            <xs:element name="favoriteNumber" maxOccurs="1" minOccurs="1"/>
            <xs:element name="comment" maxOccurs="unbounded" minOccurs="1"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Один из возможных вариантов - <xs:choice>, но он допускает только ОДИН из вариантов. Кажется неуместным перечислять каждую возможную комбинацию ордеров в качестве альтернативной последовательности: (abc, acb, bac, bca, cab, cba) ... и все же не учитывается возможность вложения комментариев между двумя другими. (например, «комментарий, номер, комментарий, цвет, комментарий, комментарий» должны быть разрешены)

<xs:all> будет работать хорошо, за исключением того, что допускается максимум 1 экземпляр каждого. Мне нужно разрешить несколько комментариев. Я мог бы поставить <xs:element name="comment" maxOccurs="unbounded" minOccurs="0"/> и выше, и ниже тега «все», но это не работает. Смотрите ниже:

<xs:element name="bio">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="comment" maxOccurs="unbounded" minOccurs="0"/>
            <xs:all> <!-- not allowed here -->
                <xs:element ref="favoriteColor" maxOccurs="1" minOccurs="1"/>
                <xs:element ref="favoriteNumber" maxOccurs="1" minOccurs="1"/>
                <xs:element ref="comment" maxOccurs="1" minOccurs="1"/>
            </xs:all>
            <xs:element ref="comment" maxOccurs="unbounded" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Есть предложения? На этой доске довольно много вопросов, которые относятся к порядку элементов в схеме, но я не смог найти ни одного, который бы касался того, что я пытаюсь сделать (где у меня есть комбинация «только один раз» и «по крайней мере» один раз). "

1 Ответ

0 голосов
/ 10 мая 2018

Я не думаю, что это возможно. Четный

<xs:sequence>
     <xs:element ref="comment" maxOccurs="unbounded" minOccurs="0" /> 
     <xs:element ref="comment" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence> 

выдаст вам ошибку. (cos-nonambig: «тест»: комментарий и «тест»: комментарий (или элементы из их группы замещения) нарушают «Уникальное присвоение частиц». При проверке по этой схеме будет создаваться неоднозначность для этих двух частиц.)

...