2015-10-15 58 views
0

我喜欢下面的XSD有一个类型层次结构:A型 - > B型 - > C型...更改simpleType元素的限制儿童型

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

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

Visual Studio中告诉我: '元素具有相同名称并且在相同范围内必须具有相同类型.'当我在类型C中使用' MrWombat

+0

这很奇怪。我用oXygen成功地尝试了这个模式,并且一切正常,以验证第一个文档并拒绝第二个文档。 Visual Studio背后的模式处理器是什么? –

+0

对不起,这是我的错! 谢谢你的帮助! – MrWombat