从我读过的所有内容中,我在下面定义的模式应该有用(强调替代方案)。我收到以下错误:此上下文中不支持“http://www.w3.org/2001/XMLSchema:alternative”元素。
你能指出我做错了吗?
这是我目前的架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema.xsd"
xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="object">
<xs:complexType>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="property" type="xs:string">
<xs:alternative test="@name='VIN'" type="VinType"/>
<xs:alternative test="@name='Year'" type="YearType"/>
<xs:alternative test="@name='Make'" type="MakeType"/>
</xs:element>
</xs:choice>
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<!-- Vehicle Identification number (VIN) -->
<xs:simpleType name="VinRestriction">
<xs:restriction base="xs:string">
<xs:length fixed="true" value="17"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="VinType" mixed="true">
<xs:simpleContent>
<xs:extension base="VinRestriction">
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="VIN" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Vehicle Year -->
<xs:simpleType name="YearRestriction">
<xs:restriction base="xs:gYear"/>
</xs:simpleType>
<xs:complexType name="YearType" mixed="true">
<xs:simpleContent>
<xs:extension base="YearRestriction">
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="Year" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Vehicle Make -->
<xs:simpleType name="MakeRestriction">
<xs:restriction base="xs:string">
<xs:enumeration value="Chevrolet"/>
<xs:enumeration value="Ford"/>
<xs:enumeration value="Mazda"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="MakeType" mixed="true">
<xs:simpleContent>
<xs:extension base="MakeRestriction">
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="Make" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
答案 0 :(得分:1)
正如Michael Kay已经指出的那样,您的错误消息最可能的原因是您的未识别的XSD处理器不支持XSD 1.1。
但是还有一些问题会导致任何符合要求的XSD 1.1处理器出现问题。
XSD 1.1处理器将拒绝具有简单内容的任何复杂类型的属性值规范mixed="true"
。 (1.0处理器可能会发出警告,但1.0表示只是忽略它。)
property
的元素声明中的第二个备选方案将类型YearType
分配给元素,但YearType
不是从xs:string
派生的,声明的类型property
的{{1}},因此作为替代品不合法。由于您的两个备选方案来自xs:string
,另一个来自xs:gYear
,因此您需要指定比xs:string
更通用的内容作为property
的声明类型。 xs:anyType
,xs:anySimpleType
或xs:anyAtomicType
中的任何一个都应该这样做。
答案 1 :(得分:0)
很可能您使用的是不支持XSD 1.1的架构处理器。