我在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不应该破坏兼容性。 有没有办法在不破坏兼容性/现有层次结构的情况下更改限制?
答案 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>