В качестве примера возьмем XSD автомобиля W3C:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://cars.example.com/schema"
xmlns:target="http://cars.example.com/schema">
<complexType name="Vehicle" abstract="true"/>
<complexType name="Car">
<complexContent>
<extension base="target:Vehicle"/>
...
</complexContent>
</complexType>
<complexType name="Plane">
<complexContent>
<extension base="target:Vehicle"/>
<sequence>
<element name="wingspan" type="integer"/>
</sequence>
</complexContent>
</complexType>
</schema>
и следующее определение «meansOfTravel»:
<complexType name="MeansOfTravel">
<complexContent>
<sequence>
<element name="transport" type="target:Vehicle"/>
</sequence>
</complexContent>
</complexType>
<element name="meansOfTravel" type="target:MeansOfTravel"/>
С этим определением вам нужно указать тип вашего экземпляра, используя xsi:type, например:
<meansOfTravel>
<transport xsi:type="Plane">
<wingspan>3</wingspan>
</transport>
</meansOfTravel>
Я просто хотел бы получить сопоставление "имя типа" - "имя элемента", чтобы его можно было заменить только
<meansOfTravel>
<plane>
<wingspan>3</wingspan>
</plane>
</meansOfTravel>
Единственный способ, которым я мог сделать это до сих пор, - сделать это явным:
<complexType name="MeansOfTravel">
<sequence>
<choice>
<element name="plane" type="target:Plane"/>
<element name="car" type="target:Car"/>
</choice>
</sequence>
</complexType>
<element name="meansOfTravel" type="target:MeansOfTravel"/>
Но это означает, что я должен перечислить все возможные подтипы в сложном типе «MeansOfTravel». Нет ли способа заставить синтаксический анализатор XML предположить, что вы имеете в виду «Плоскость», если вы называете элемент «плоскостью»? Или я должен сделать выбор явным? Я просто хотел бы сохранить свой дизайн СУХИМ - если у вас есть какие-либо другие предложения (например, группы или что-то в этом роде) - я весь слушаю.