Использовать ‹xs:all› в комплексном типе XML-схемы?

У меня определены следующие XML complexTypes:

<xs:complexType name="loss">
    <xs:all>
        <xs:element name="lossCause" type="xs:string"/>
        <xs:element name="lossDate" type="xs:dateTime"/>
        <xs:element name="lossDescription" type="xs:string"/>
        <xs:element name="lossLocation" type="address" minOccurs="0"/>
        <xs:element name="lossTime" type="xs:string" minOccurs="0"/>
        <xs:element name="officials" minOccurs="0">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="official" type="official" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:all>
    <xs:attribute name="incidentOnly" type="xs:boolean" use="required"/>
    <xs:attribute name="lawsuit" type="xs:boolean" use="required"/>
</xs:complexType>

и:

<xs:complexType name="propLoss">
    <xs:complexContent>
        <xs:extension base="loss">
            <xs:all>
                <xs:element name="damageDescription" type="xs:string"/>
                <xs:element name="property" type="property"/>
                <xs:element name="responsibleParty" type="contact" minOccurs="0"/>
            </xs:all>
            <xs:attribute name="businessOperational" type="xs:boolean" use="required"/>
            <xs:attribute name="propertyLivable" type="xs:boolean" use="required"/>
            <xs:attribute name="weatherRelated" type="xs:boolean" use="required"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

Однако после проверки я получаю сообщение об ошибке, указывающее, что группа моделей all не разрешена ни в определении loss complexType, ни в его расширении propLoss. Что я делаю не так?

Спасибо!


person holic87    schedule 29.09.2011    source источник


Ответы (2)


Проблема с propLoss заключается в том, что вы не можете расширить группу all в схеме XML (1.0). Из спецификации:

Примечание. Эта спецификация допускает только добавление, а не другие виды расширений. Это решение упрощает обработку приложений, необходимую для приведения экземпляров из производного типа к базовому. В будущих версиях может быть разрешено больше видов расширений, требующих более сложных преобразований для выполнения приведения.

Не уверен, в чем проблема с loss, если только это не побочный ущерб от ошибки propLoss.

person xan    schedule 29.09.2011
comment
Благодарю за разъяснение. У вас случайно не было никаких идей для обхода этого? - person holic87; 30.09.2011
comment
Поскольку «все» элементы группы ограничены не более чем одним вхождением, один аргумент: если порядок не важен в вашей модели данных, просто выберите произвольный порядок для вашего формата обмена. То есть преобразовать каждое «все» в «последовательность». - person xan; 30.09.2011

Обратите внимание, что в XSD 1.1 группы all могут быть расширены, как показано здесь, что означает, что все дочерние элементы, упомянутые в любой группе all, должны присутствовать в любом порядке. (То есть все группы 1 и все группы 2 объединяются в одну группу всех с объединением их дочерних элементов.)

person C. M. Sperberg-McQueen    schedule 21.08.2012