У меня есть какой-то XML, где вы могли бы иметь
<a type="b">
<b></b>
</a>
или
<a type="c">
<c></c>
</a>
или
<a type="d">
<d></d>
</a>
, но следующее недопустимо:
<a type="c">
<b></b>
</a>
Я пытаюсь создать XML-схему, которая представляет это, но, если я правильно понимаю, следующее не правильно связывает атрибут type с содержимым тега.
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a" type="A" minOccurs="1" maxOccurs="1" />
<xs:complexType name="A">
<xs:attribute name="type" type="AType" use="required" />
<xs:choice>
<xs:group ref="B" />
<xs:group ref="C" />
<xs:group ref="D" />
</xs:choice>
</xs:complexType>
<xs:simpleType name="AType">
<restriction base="xs:string">
<enumeration value="b"/>
<enumeration value="c"/>
<enumeration value="d"/>
</restriction>
</xs:simpleType>
<xs:complexType name="B">
STUFF
</xs:complexType>
<xs:complexType name="C">
OTHER STUFF
</xs:complexType>
<xs:complexType name="D">
YET MORE STUFF
</xs:complexType>
</xs:schema>
Это единственный способ сделать это правильно, чтобы быть невероятно многословным, как:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a" type="A" minOccurs="1" maxOccurs="1" />
<xs:complexType name="A">
<xs:choice>
<xs:group ref="B" />
<xs:group ref="C" />
<xs:group ref="D" />
</xs:choice>
</xs:complexType>
<xs:complexType name="B">
<xs:attribute name="type" type="xs:string" fixed="b" />
STUFF
</xs:complexType>
<xs:complexType name="C">
<xs:attribute name="type" type="xs:string" fixed="c" />
OTHER STUFF
</xs:complexType>
<xs:complexType name="D">
<xs:attribute name="type" type="xs:string" fixed="d" />
YET MORE STUFF
</xs:complexType>
</xs:schema>