我定义了以下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中覆盖元素定义吗?
答案 0 :(得分:1)
看看你对“扩展”所做的事情:
限制可能会有效,但可能会违反您设置默认值的原因 - 这可能与您的期望不同(请参阅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>
如果您愿意,您可以将默认值移至父级 - 这一切都取决于您在此处真正想要实现的目标。我真的认为你已经混淆了默认对元素的作用;看起来你的期望更像它对属性的作用。