XSD - повторное использование / наследование тегов

У меня есть два тега, которые напоминают какое-то логическое выражение:

<complexType name="condition">
    <choice minOccurs="0">
        <element name="a" type="myns:condition-a"/>
        <element name="b" type="myns:condition-b"/>
    </choice>
</complexType>

<complexType name="condition-a">
    <all>
        <element name="value" type="string"/>
    </all>
</complexType>

<complexType name="condition-b">
    <all>
        <element name="value" type="string"/>
    </all>
</complexType>

Я хотел бы объединить эти условия с and, or а также not конструкции. Как это:

<condition>
    <and>
        <condition-a><value>X</value></condition-a>
        <condition-b><value>Y</value></condition-b>
        <not>
            <condition-a><value>Z</value></condition-a>
        </not>
    </and>
</condition>

Обратите внимание, что condition тег используется только сверху, а не внутри and, or а также not,

Я придумал следующие определения:

<complexType name="condition">
    <choice minOccurs="0">
        <element name="a" type="myns:condition-a"/>
        <element name="b" type="myns:condition-b"/>
        <element name="and" type="myns:condition-and"/>
        <element name="or" type="myns:condition-or"/>
        <element name="not" type="myns:condition-not"/>
    </choice>
</complexType>

<complexType name="condition-a">
    <all>
        <element name="value" type="string"/>
    </all>
</complexType>

<complexType name="condition-b">
    <all>
        <element name="value" type="string"/>
    </all>
</complexType>

<complexType name="condition-and">
    <choice maxOccurs="unbounded">
        <element name="a" type="myns:condition-a"/>
        <element name="b" type="myns:condition-b"/>
        <element name="and" type="myns:condition-and"/>
        <element name="or" type="myns:condition-or"/>
        <element name="not" type="myns:condition-not"/>
    </choice>
</complexType>

<complexType name="condition-or">
    <choice maxOccurs="unbounded">
        <element name="a" type="myns:condition-a"/>
        <element name="b" type="myns:condition-b"/>
        <element name="and" type="myns:condition-and"/>
        <element name="or" type="myns:condition-or"/>
        <element name="not" type="myns:condition-not"/>
    </choice>
</complexType>

<complexType name="condition-not">
    <choice>
        <element name="a" type="myns:condition-a"/>
        <element name="b" type="myns:condition-b"/>
        <element name="and" type="myns:condition-and"/>
        <element name="or" type="myns:condition-or"/>
        <element name="not" type="myns:condition-not"/>
    </choice>
</complexType>

Хотя это работает, это не оптимально. Я повторяю возможные условия в and, or а также not теги. Как побочный эффект, сгенерированный код JAXB является беспорядком.

Есть ли более элегантный подход к этому?

1 ответ

Решение

Вместо многократного повторения одного и того же выбора XML-схема позволяет вам создать глобальную xs: group (xs: choice, xs: sequence или xs: all) и ссылаться на нее в других частях вашей схемы, точно так же, как глобальные типы и элементы.

Таким образом, вы можете использовать что-то вроде этого:

<group name="anyCondition">
    <choice>
        <element name="a" type="myns:condition-a"/>
        <element name="b" type="myns:condition-b"/>
        <element name="and" type="myns:condition-and"/>
        <element name="or" type="myns:condition-or"/>
        <element name="not" type="myns:condition-not"/>
    </choice>
</group>

<complexType name="condition-and">
    <group ref="myns:anyCondition" maxOccurs="unbounded"/>
</complexType>

<complexType name="condition-or">
    <group ref="myns:anyCondition" maxOccurs="unbounded"/>
</complexType>

<complexType name="condition-not">
    <group ref="myns:anyCondition"/>
</complexType>
Другие вопросы по тегам