xld schema:如何强制使用默认值

时间:2012-06-08 21:27:49

标签: xml xsd

我定义了以下xsd类型:

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

你可以猜到,我想通过给出一个默认值'foo'并改变它的出现范围来覆盖一个类型的元素(就像我在java中所做的那样)。

不幸的是,在编写<childType />时,我应该有一个att="foo"的元素,但我的XML验证器说:The content of element 'childType' is not complete. One of '{att}' is expected.似乎元素定义的覆盖不起作用

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

1 个答案:

答案 0 :(得分: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>

如果您愿意,您可以将默认值移至父级 - 这一切都取决于您在此处真正想要实现的目标。我真的认为你已经混淆了默认对元素的作用;看起来你的期望更像它对属性的作用。