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>