Я хочу указать схему XML, которая не предписывает порядок, но включает требование выбора. Что считается «наилучшей практикой» для этого?
Например, предположим, что я хочу, чтобы следующие оба действовали:
<foo>
<bar>3</bar>
<baz>tree</baz>
<blort>
<location>somewhere</location>
<elevation>2000ft</elevation>
<zing>1234567</zing>
</blort>
</foo>
и
<foo>
<baz>tree</baz>
<blort>
<elevation>2000ft</elevation>
<location>somewhere</location>
<bling>
<name>A name</name>
<number>7</number>
</bling>
</blort>
<bar>3</bar>
</foo>
С общими правилами «английского описания», которые выглядят примерно так: «Вы должны включать столбец, баз и бластер в любом порядке. Бласт должен включать местоположение, высоту и ровно одно из или побрякушки, или звуки, в любом порядке. "
Я хочу разобрать это в проверяющем парсере, который использует XSD 1.0. Моя первая наивная попытка была такой:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
targetNamespace="http://my.url/Foo"
elementFormDefault="qualified"
xmlns="http://my.url/Foo"
xmlns:mstns="http://my.url/Foo"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="bling">
<xs:all>
<xs:element name="name" type="xs:string"/>
<xs:element name="number" type="xs:decimal"/>
</xs:all>
</xs:complexType>
<xs:complexType name="blort">
<xs:all>
<xs:element name="location" type="xs:string"/>
<xs:element name="elevation" type="xs:string"/>
<xs:choice>
<xs:element name="zing" type="xs:string"/>
<xs:element name="bling" type="mstns:bling"/>
</xs:choice>
</xs:all>
</xs:complexType>
<xs:complexType name="foo">
<xs:all>
<xs:element name="bar" type="xs:decimal"/>
<xs:element name="baz" type="xs:string"/>
<xs:element name="blort" type="mstns:blort"/>
</xs:all>
</xs:complexType>
<xs:element name="foo" type="mstns:foo"/>
</xs:schema>
Но, конечно, это не работает. Вы не можете поместить «выбор» в «все».
Мне не удалось найти способ выразить в XSD то, что я ищу.