围绕这一点有一个常见的设计模式,您可以使用子类型(正如您已经做的那样),以及替换组中的元素。替换组中的元素必须是被替换元素的子类型。
不可否认,替换组元素需要定义为全局元素。所以你会得到这个:
<complexType name="MeansOfTravel">
<complexContent>
<sequence>
<element ref="transport"/>
</sequence>
</complexContent>
</complexType>
<element name="transport" type="target:Vehicle"/>
<element name="plane" type="target:Plane" substitutionGroup="target:transport"/>
然后,在XML文档中可以使用:
<meansOfTravel>
<plane>...</plane>
</meansOfTravel>
有关替换组的详细信息
here
. 不,不幸的是,解析器无法猜到这一点,所以您仍然需要列出元素:(尽管与选择相比,有一个优势:模式可以通过导入而不修改,从外部扩展。无法扩展选择。