0

我已经定义了以下 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 />,我应该有一个带有 a 的元素att="foo",但是我的 XML 验证器说:The content of element 'childType' is not complete. One of '{att}' is expected.似乎元素定义的覆盖不起作用。

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

4

1 回答 1

1

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

XSD 图

限制可能会起作用,但它可能与您设置默认值的原因背道而驰 - 这可能与您的期望不同(请参阅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>

如果需要,您可以将默认值移至父级 - 这完全取决于您在这里真正想要实现的目标。我真的认为您对元素的默认工作方式感到困惑;似乎您期望它更像属性的工作方式。

于 2012-06-08T22:16:02.967 回答