XML Schema - 带有继承属性List的simpleType

时间:2015-09-24 03:19:40

标签: java xml inheritance jaxb schema

我有一个定义以下类型的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格式?

1 个答案:

答案 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。但它不会成为你想要的好继承。