2009-11-25 2 views
4

Моей структуры данных выглядит следующим образомЭлемент повторения под <xs:all>

<datastructure> 
    <field1>data</field1> 
    <field2>data</field2> 
    <field3>data</field3> 
    <field4>data</field4> 
    <field4>data</field4> 
    <field4>data</field4> 
    <field4>data</field4> 
</datastructure> 

Все поля должны появляться ровно один раз, за ​​исключением поля 4, которое может появиться [0, неограниченные] раз. Также нет веских оснований заботиться о заказе.

Я не мог прийти со схемой, чтобы проверить это. Использование последовательности будет работать как:

<xs:element name="datastructure" type="datastructureType"/> 
<xs:complexType name ="datastructureType"> 
    <xs:sequence> 
    <xs:element name="field1"/> 
    <xs:element name="field2" /> 
    <xs:element name="field3"/> 
    <xs:element name="field4" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:complexType> 

Но это налагает заказ, который у меня нет веских оснований для наложения. Альтернатива использует все, но это требует изменения XML в:

<datastructure> 
    <field1>data</field1> 
    <field2>data</field2> 
    <field3>data</field3> 
    <field4List> 
    <field4>data</field4> 
    <field4>data</field4> 
    <field4>data</field4> 
    <field4>data</field4> 
    </field4List> 
</datastructure> 

Поскольку дети все могут иметь только MaxOccurs до одного. Это добавляет бремя field4List, которое кажется бесполезным во всех практических отношениях.

Как написать схему, которая будет проверять мой xml, как пример последовательности, но это не заботится о заказе? Или, альтернативно, почему такая схема была бы плохой идеей в первую очередь?

ответ

0

ограничение Cardinality является ограничение Sever для использования хз: все во многих реальных схемах. С этой точки зрения Relax NG намного более гибкая.

Я должен использовать «field4List way»; он добавляет еще один элемент в вашу схему, но оставляет его неупорядоченным.