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