如何在XML Schema 1.1中使用替代方法

时间:2013-01-29 22:32:54

标签: xml schema xsd

从我读过的所有内容中,我在下面定义的模式应该有用(强调替代方案)。我收到以下错误:此上下文中不支持“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>

2 个答案:

答案 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:anyTypexs:anySimpleTypexs:anyAtomicType中的任何一个都应该这样做。

答案 1 :(得分:0)

很可能您使用的是不支持XSD 1.1的架构处理器。