假设我有一些模式:
<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并调用这个扩展栏。
为了使事情变得复杂,我们还假定别人已经定义了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>的base属性只接受XSD类型的参数,而不是元素。如何扩展元素? (可以扩展一个元素吗?)
我会创建一个新的类型,模仿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" />