假设我有一些架构:
<xsd:schema ...>
<xsd:element name="foo">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="fooElement" type="xs:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
这定义了一些元素foo
,其中包含一些带有类型字符串的元素fooElement
。我现在想要将元素foo
扩展为也有一个元素barElement
,并将此扩展名称为bar
。
为了使事情复杂化,我们还假设其他人已定义foo
,并且无法更改架构。虽然这里的示例很简单,但我们也假设foo
的内容可能更复杂,定义新模式并不像复制元素fooElement
那么简单。
实际上,我想定义一个新架构:
<xsd:schema xmlns:fns="otherschema" ...>
<xsd:import namespace="otherschema" />
<xsd:element name="bar">
<xsd:complexContent>
<xsd:extension base="fns:foo">
<xsd:sequence>
<xsd:element name="barElement" type="xs:string" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:element>
</xsd:schema>
不幸的是<xsd:extension>
的{{1}}属性只接受XSD类型参数,而不接受元素。如何扩展元素? (我可以扩展元素吗?)
答案 0 :(得分:9)
我会创建一个模仿foo元素然后从中扩展的新类型。虽然它不是最好的解决方案,但您可以获得与直接扩展元素相同的结果。
<xs:complexType name="fooType">
<xs:sequence>
<xs:element name="fooElement" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="barType">
<xs:complexContent mixed="false">
<xs:extension base="fooType">
<xs:sequence>
<xs:element name="barElement" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="bar" type="barType" />