这是我的xml架构的一部分
<xs:complexType name="Friend">
<xs:all>
<xs:element name="name" type="xs:string" />
<xs:element name="phone" type="xs:string" />
<xs:element name="address" type="xs:string" />
</xs:all>
</xs:complexType>
<xs:complexType name="Coworker">
<xs:all>
<xs:element name="name" type="xs:string" />
<xs:element name="phone" type="xs:string" />
<xs:element name="office" type="xs:string" />
</xs:all>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
为了更好的可维护性,我希望在(抽象)超类型或类似的东西中具有共享属性.但更重要的是,我希望所有元素都是无序的,也是可选的.
这是可能的,最好的方法是什么?
xcu*_*cut 15
您必须稍微限制一下,在XML Schema中无法实现您尝试做的一些事情.
假设你介绍一个叫复合类型Person是一个超强型的Friend和Coworker.以下是您的选择:
xs:all用xs:sequence,删除name和phone从子类型,增加了超类型,并添加继承.现在必须订购您的元素,但您可以单独选择它们.在XML Schema中使用类型层次结构是非法的xs:all,因为处理器无法分辨父内容模型停止的位置以及子内容模型的启动.xs:all用<xs:choice maxOccurs="unbounded">两种类型,并添加你的产业.然后你的元素再次变得无序,但它们可能重复.总而言之:鉴于你的类型名称,我猜你的要求不会完全得到满足.我会选择第一个选项:坚持任意元素顺序通常不像看起来那么有用.
在这个问题和已接受的答案发布一年半后,XSD 1.1 发布了。在此版本中,可以指定 OP 的要求,因为xs:all取消了许多限制。其中之一是现在可以扩展xs:all.
使用 XSD 1.1,您可以指定以下内容:
<xs:complexType name="Person" abstract="true">
<xs:all>
<xs:element name="name" type="xs:string" minOccurs="0" />
<xs:element name="phone" type="xs:string" minOccurs="0" />
</xs:all>
</xs:complexType>
<xs:complexType name="Friend">
<xs:complexContent>
<xs:extension base="Person">
<xs:all>
<xs:element name="address" type="xs:string" minOccurs="0" />
</xs:all>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Coworker">
<xs:complexContent>
<xs:extension base="Person">
<xs:all>
<xs:element name="office" type="xs:string" minOccurs="0" />
</xs:all>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
这定义了以下类型:
Personname:具有可选无序和元素的抽象类型phone;Friend: 扩展Person将可选address元素添加到无序元素列表中;Coworker: 扩展Coworker将可选office元素添加到无序元素列表中。请注意,此解决方案并不适用于所有 XML 处理器:尽管 XSD 1.1 发布已经过去了 8 年,但许多处理器仍然只支持 XSD 1.0。