是的,绝对可以,使用xsi:type(这可能不是你想要的!)。 例如下面的xsd;
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xs:element name="data">
<xs:complexType>
<xs:choice>
<xs:element ref="elemParent" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="elemParent" type="ctBase"></xs:element>
<xs:complexType name="ctNoAttChildReq">
<xs:complexContent>
<xs:extension base="ctBase">
<xs:sequence>
<xs:element name="elemKid" type="xs:string"></xs:element>
<xs:element name="elemKidAdditional" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ctAttNoChild">
<xs:complexContent>
<xs:extension base="ctBase">
<xs:attribute name="attReq" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ctBase" abstract="true">
<xs:sequence/>
</xs:complexType>
你有任何一个属性或一个或更多的孩子一个实例,但你必须有XSI:类型的实例,它可能会或可能不会是一个表明,塞。这种类型的
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Xsds/StackOverflow_2070316_WIP.xsd">
<elemParent attReq="Yo!" xsi:type="ctAttNoChild"/>
<elemParent xsi:type="ctNoAttChildReq">
<elemKid>Adam</elemKid>
</elemParent>
<elemParent xsi:type="ctNoAttChildReq">
<elemKid>Eve</elemKid>
<elemKidAdditional>Sid</elemKidAdditional>
</elemParent>
答案不适合我满意的。你的陈述背后的推理是什么? – 2010-01-15 11:00:45
XML模式类型与您的OO编程类型非常相似。您可以创建复杂类型,并且可以限制元素和属性的元素类型的顺序以及可以分配哪种类型的值的限制。这就是所有的xsd可以为你做的。你想要的是一些限制,跨越多个元素/属性,这是xsd根本无法实现的。你必须编写自己的代码来验证这一点。 – affan 2010-01-15 14:51:52
我也认为这是不可能的,而且这是一个非常好的答案(如果它是正确的):-) – 2010-01-15 15:21:16