更改子类型中简单类型元素的限制

Change the restrictions of a simpletype element in child type

我在 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>

Type C不需要在Type B中添加任何元素所以定义如下:

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

现在 ElementA 的类型 C 的限制已经改变 - 它的 maxIncluse 应该是 5 而不是 10。

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

您可以通过将 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>