我有一个定义以下类型的xml架构
<xsd:complexType name="visualElement" abstract="true">
<xsd:attribute name="id" type="xsd:ID"></xsd:attribute>
<xsd:attribute name="style" type="xsd:string"></xsd:attribute>
</xsd:complexType>
<xsd:complexType name="textElement">
<xsd:complexContent>
<xsd:extension base="sa:visualElement">
<xsd:attribute name="label" type="xsd:string" use="required" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xs:element name="text" type="textElement"/>
问题在于这意味着我们必须定义一个文本元素如下
<text id="myText" style="Fancy" label="This is the display text" />
当我真正想要做的就是像这样定义
<text id="myText" style="Fancy">
This is the display text here.
</text>
我的textElement Type应该扩展visualElement Type,因为我们使用JAXB生成Java Classes来解析XML。然后使用JaxB CLasses继承以类似的方式处理所有可视元素。
有没有办法构建模式,以便我可以在继承visualElement类型的属性的同时实现所需的XML格式?
答案 0 :(得分:0)
我认为你必须让visualElement
允许简单的内容。然后你可以在textElement
中扩展或限制它。类似的东西:
<xsd:complexType name="visualElement" abstract="true">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="id" type="xsd:ID"></xsd:attribute>
<xsd:attribute name="style" type="xsd:string"></xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="textElement">
<xsd:simpleContent>
<xsd:extension base="sa:visualElement"/>
</xsd:complexContent>
</xsd:complexType>
我认为你必须让visualElement
包含simpleContent
,否则你无法在textElement
中扩展它。但请尝试:
<xsd:complexType name="visualElement" abstract="true">
<xsd:attribute name="id" type="xsd:ID"></xsd:attribute>
<xsd:attribute name="style" type="xsd:string"></xsd:attribute>
</xsd:complexType>
<xsd:complexType name="textElement">
<xsd:simpleContent>
<xsd:extension base="sa:visualElement"/>
</xsd:complexContent>
</xsd:complexType>
但是,我认为这不会起作用。
另一种选择是使用attributeGroup
。但它不会成为你想要的好继承。