【问题标题】:xsd extension base element with attributes具有属性的 xsd 扩展基本元素
【发布时间】:2014-04-03 08:32:35
【问题描述】:

假设我有架构

 <xs:complexType name="superType">

        <xs:sequence>
            <xs:element type="s:itemType" name="item" maxOccurs="unbounded" minOccurs="1">
            </xs:element>
        </xs:sequence>

        <xs:attribute type="s:stringNameType" name="name" use="required"/>
        <xs:attribute type="s:extraType" name="extra" use="optional" default="ALL"/>

    </xs:complexType>

还有我的下一个元素:

<xs:complexType name="elegantType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="s:stringNameType" name="name" use="required"/>
                <xs:attribute type="s:extraType" name="extra" use="optional" default="ALL"/>

            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

如您所见,elegantTypesuperType 具有相同的属性:

<xs:attribute type="s:stringNameType" name="name" use="required"/>
<xs:attribute type="s:extraType" name="extra" use="optional" default="ALL"/>

是否可以使用扩展为该元素创建基本类型?

我尝试定义基本类型,但出现错误: 派生类型的内容类型和其基类型的内容类型必须是混合的,或者都是纯元素的。类型“superType”只是元素,但它的基本类型不是。

这是我尝试做的:

            <xs:element type="s:itemType" name="item" maxOccurs="unbounded" minOccurs="1">
            </xs:element>
        </xs:sequence>
        </xs:extension>
    </xs:complexContent>


   <!-- <xs:attribute type="s:stringNameType" name="name" use="required"/>
    <xs:attribute type="s:extraType" name="extra" use="optional" default="ALL"/>-->

</xs:complexType>

<xs:complexType name="resourceBase" mixed="true">

    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute type="s:stringNameType" name="name" use="required"/>
            <xs:attribute type="s:extraType" name="extra" use="optional" default="ALL"/>

        </xs:extension>
    </xs:simpleContent>

</xs:complexType>

我的问题是我有很多元素,其中大多数都有相同的属性。我需要创建基本元素

【问题讨论】:

    标签: xml xsd xsd-validation


    【解决方案1】:

    如果您有许多具有重复属性的元素,您可以使用在属性组中声明它们并在多个元素中重用 attributeGroup 对象:

    在您的架构中,您可以像这样声明一个组:

    <xs:attributeGroup name="attributes">
        <xs:attribute type="s:stringNameType" name="name" use="required"/>
        <xs:attribute type="s:extraType" name="extra" use="optional" default="ALL"/>
    </xs:attributeGroup>
    

    然后将其添加到您要添加属性的位置:

    <xs:complexType name="superType">
        <xs:sequence>...</xs:sequence>
        <xs:attributeGroup ref="attributes"/>
    </xs:complexType>
    
    <xs:complexType name="elegantType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attributeGroup ref="attributes"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    

    【讨论】:

    • 好的。但是当我使用 xjc 时,我得到了:@XmlElements({ @XmlElement(name = "type1", type = Type1.class), @XmlElement(name = "type2", type = Type2.class), @XmlElement(name = "type3", type = Type3.class) }) protected List&lt;Object&gt; type1OrType2OrType3; 但我想得到:List&lt;Type1&gt; type1; List&lt;Type2&gt; type2: List&lt;Type3&gt; type3 List&lt;T extends BaseType&gt; types
    • 嗯。您可能必须使用 JAXB 绑定文件来映射它。由于这与 JAXB 相关,因此最好提出一个新问题来描述您的问题,并确保使用 JAXB 对其进行标记,以便您可以从 JAXB 专家那里获得帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多