Как получить дополнительный элемент, который будет отображаться только с некоторыми из возможных значений в схеме XML - PullRequest
1 голос
/ 06 января 2020

Я хочу иметь следующую структуру XML:

элемент option может иметь одно из нескольких значений, для некоторых значений я также хочу иметь дополнительный элемент parameter, и у некоторых их нет:

<test>
    <option>foo</option>
    <parameter>123</parameter>
</test>

или

<test>
    <option>bar</option>
</test>

Я пытался сделать это следующим образом:

<xsd:element name="test" type="testOptionType" minOccurs="1" maxOccurs="1"/>

<xsd:complexType name="testOptionType">
    <xsd:choice>
        <xsd:sequence>
            <xsd:element name="option" type="testOptionWithParameterEnum" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="parameter" type="xsd:string" minOccurs="1" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:sequence>
            <xsd:element name="option" type="testOptionEnum" minOccurs="1" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:choice>
</xsd:complexType>

<xsd:simpleType name="testOptionWithParameterEnum">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="aaa" />
    </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="testOptionEnum">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="bbb"/>
    </xsd:restriction>
</xsd:simpleType>

Но когда я пытаюсь проверить это, я получаю ошибку:

Ошибка для типа 'testOptionType'. В группе моделей появляются несколько элементов с именем option, с разными типами.

Есть ли способ реализовать то, что я хочу в схеме?

1 Ответ

0 голосов
/ 07 января 2020

Здесь есть две проблемы:

Во-первых, ваш xs:choice неоднозначен.

Вместо того, чтобы определять модель контента как choice(sequence(A,B), A), определите ее как sequence(A, optional(B)), где optional B выражается с использованием minOccurs="0" для частицы xs:element.

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

Во-вторых, ваша модель содержимого нарушает ограничение "объявления элементов согласованы". Если две элементные частицы в модели содержимого имеют одинаковое имя, они также должны иметь одинаковый тип. В XSD 1.0 этого нет. В XSD 1.1 вы можете добавлять дополнительные ограничения, используя утверждения, например (в объявлении теста элемента)

<xs:assert test="if (exists(parameter)) then option='aaa' else option='bbb'"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...