Как я могу создать схему, которая требует определенных элементов, допускает другие и не зависит от порядка? - PullRequest
3 голосов
/ 21 июля 2010

Я хочу создать схему XML, которая содержит следующее:

<xs:complexType name="Record">
        <!--required elements-->
        <xs:element name="RecordTag" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="RecordSize" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="RecordSection" type="xs:string" minOccurs="1" maxOccurs="1" />

        <!--optional elements-->
        <xs:element name="RecordName" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordType" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordValue" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordDefault" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordComment" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordURL" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="Condition" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="Master" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordCurrent" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="RecordId" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:complexType>

Как вы можете заметить по комментариям, я хочу, чтобы три верхних элемента были обязательными, а остальные необязательными.Схема должна допускать, чтобы элементы отображались в любом порядке.

Теперь, если я использую индикатор <xs:sequence>, порядок применяется, что мне не нужно.Если я использую индикатор <xs:all>, то для схемы требуются все элементы, даже если для значения minOccurs установлено значение 0.

Есть ли другой индикатор, который я могу использовать для выполнениямоя задача?

Спасибо!

1 Ответ

1 голос
/ 11 января 2014

Только для иллюстрации, давайте предположим XSD ниже;он ничем не отличается от того, который представлен в посте, за исключением того, что он синтаксически корректен (путем введения xs: all compositor) и для легкого создания образца XML, я также добавил фиктивный элемент Record.

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Record" type="Record"/>
    <xs:complexType name="Record">
        <xs:all>
            <!--required elements-->
            <xs:element name="RecordTag" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="RecordSize" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="RecordSection" type="xs:string" minOccurs="1" maxOccurs="1"/>

            <!--optional elements-->
            <xs:element name="RecordName" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordType" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordValue" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordDefault" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordComment" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordURL" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="Condition" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="Master" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordCurrent" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="RecordId" type="xs:string" minOccurs="0" maxOccurs="1"/>          
        </xs:all>
    </xs:complexType>
</xs:schema>

Имея этот пример XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RecordId>RecordId1</RecordId>
    <RecordCurrent>RecordCurrent1</RecordCurrent>
    <Master>Master1</Master>
    <Condition>Condition1</Condition>
    <RecordURL>RecordURL1</RecordURL>
    <RecordSection>RecordSection1</RecordSection>
    <RecordSize>RecordSize1</RecordSize>
    <!--
    <RecordTag>RecordTag1</RecordTag>
    -->
</Record>

Можно получить это сообщение об ошибке (при использовании .NET):

Элемент 'Запись' имеет неполныйсодержание.Список возможных ожидаемых элементов: 'RecordTag'.

Xerces сказал бы:

cvc-complex-type.2.4.b: Содержимое элемента 'Record'не завершено.Ожидается один из '{RecordTag}'.

Все вышесказанное является лишь практическим аргументом о том, что первоначальное утверждение в вопросе, которое читается ниже, является неправильным.

Если я используюиндикатор, то схема требует отображения всех элементов, даже если для значения minOccurs установлено значение 0.

Заданный здесь запрос вполне достижим в XSD 1.0 через all композитор.В спецификации нет ничего, что указывало бы на обратное;Рискну предположить, что, возможно, возможной ошибкой была реализация в XML-процессоре с поддержкой XSD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...