带有属性的xsd扩展基本元素

时间:2014-04-02 19:49:55

标签: xml xsd xsd-validation

假设我有架构

 <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>

正如您所看到的, elegantType superType 具有相同的属性:

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

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

我尝试定义基类型但我有错误:  派生类型的内容类型及其基类的内容类型必须混合或两者都是仅元素。输入&#39; superType&#39;仅是元素,但其基本类型不是。

这是我尝试做的事情:                                   

            <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>

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

1 个答案:

答案 0 :(得分:2)

如果您有许多具有重复属性的元素,则可以使用在属性组中声明它们并在多个元素中重用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>