更改子类型中simpletype元素的限制

时间:2015-10-15 06:38:31

标签: xml xsd

我在xsd中有类型层次结构,如下所示:类型A - > B型 - >输入C ......

现在类型B 的定义如下:

   <xs:complexType name="TypeB">
    <xs:complexContent>
      <xs:extension base="TypeA" >
        <xs:sequence>
          ...
          <xs:element name="ElementA" minOccurs="0">
            <xs:simpleType>
              <xs:restriction base="xs:int">
                <xs:minInclusive value="0"/>
                <xs:maxInclusive value="10"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

C型不需要向B类添加任何元素,因此定义如下:

  <xs:complexType name="TypeC">
    <xs:complexContent>
      <xs:extension base="TypeB">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

现在,对于ElementA的Type C的限制已经改变 - 它的maxIncluse应该是5而不是10。

我可以更改Type C但是更改Type B不应该破坏兼容性。 有没有办法在不破坏兼容性/现有层次结构的情况下更改限制?

1 个答案:

答案 0 :(得分:1)

您可以通过将TypeC声明为TypeB的限制并明确重新定义其复杂内容来实现。但是,要使它工作,您需要显式声明将xs:int限制在0和10之间的简单类型,并将其显式限制为另一个将maxInclusive更改为5的简单类型。这个简单类型限制是显式的很重要,正如here所述。

架构看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="ElementC" type="TypeC"/>
  <xs:complexType name="TypeA">
    <xs:sequence>
      <xs:element name="foobar" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="TypeB">
    <xs:complexContent>
      <xs:extension base="TypeA" >
        <xs:sequence>
          <xs:element name="ElementA" type="Type10" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>  
  <xs:simpleType name="Type10">
    <xs:restriction base="xs:int">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="10"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Type5">
    <xs:restriction base="Type10">
      <xs:maxInclusive value="5"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="TypeC">
    <xs:complexContent>
      <xs:restriction base="TypeB">
        <xs:sequence>
          <xs:element name="foobar" type="xs:string"/>
          <xs:element name="ElementA" type="Type5" minOccurs="0"/>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

然后这将是有效的:

<?xml version="1.0" encoding="UTF-8"?>
<ElementC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="schema.xsd">
  <foobar/>
  <ElementA>5</ElementA>
</ElementC>

而这不是:

<?xml version="1.0" encoding="UTF-8"?>
<ElementC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="schema.xsd">
  <foobar/>
  <ElementA>6</ElementA>
</ElementC>