更改子类型中简单类型元素的限制
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>
我在 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>