以W3C车载XSD为例:
<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 解析器假定您的意思是“平面”?还是我必须明确做出选择?我只想让我的设计保持干燥——如果你有任何其他建议(比如团体等)——我会全力以赴。