2012-06-08 84 views
0

我已经定义了以下XSD类型:XLD模式:如何强制默认值

<xs:complexType name="parentType"> 
    <xs:sequence> 
    <xs:element name="att" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="childType"> 
    <xs:complexContent> 
    <xs:extension base="parentType"> 
     <xs:sequence> 
     <xs:element name="att" type="xs:string" default="foo" minOccurs="0" /> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

正如您可以猜到,我想给一个默认值“富”来覆盖类型的元素并改变它的发生范围(就像我在java中所做的那样)。

不幸的是,写<childType />的时候,我希望有一个元素与att="foo",但我的XML验证说:The content of element 'childType' is not complete. One of '{att}' is expected.看来元素定义的覆盖没有工作。

我错过了什么吗?你知道如何覆盖XSD中的元素定义吗?

回答

1

看看你的“扩展”做了什么:

XSD Diagram

的限制可能会奏效,但随后可能会反对你放在一个默认的原因 - 这可能是你期望的不同(有关说明,请参见this post on SO)。

<xs:complexType name="childType"> 
    <xs:complexContent> 
     <xs:restriction base="parentType"> 
      <xs:sequence> 
       <xs:element name="att" type="xs:string" default="foo" /> 
      </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 

的事情是,你不能让该元素的限制可选。默认设置仍然有效;差异是一个空的元素将被视为foo。

你可能有这样的事情,而不是:

<xs:complexType name="parentType"> 
    <xs:sequence> 
     <xs:element name="att" type="xs:string" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="childType"> 
    <xs:complexContent> 
     <xs:restriction base="parentType"> 
      <xs:sequence> 
       <xs:element name="att" type="xs:string" default="foo" /> 
      </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 

您可以将默认移动到父,如果你想 - 这一切都取决于你真的想在这里实现。我真的觉得你很困惑默认作品的元素;看起来你期望更像它对于属性的作用。