xsd在不同的命名空间中重用复杂类型

时间:2012-03-02 08:51:34

标签: xml xsd

我有2个xsd属于2个不同的命名空间。我可以从一个不同的namespance引用一个复杂类型作为xsd中的元素,并将子元素添加到它吗?

Global.xsd - namespace - Namespace

<xs:complexType name = "body" mixed="true">
<xs:sequence>
    <xs:choice maxOccurs="unbounded" minOccurs="0">
        <xs:element name="fontStyle" type="fontStyle"/>
        <xs:element name="link" type="link"/>
        <xs:element name="mark" type="mark"/>
        <xs:element name="orderedList" type="orderedList"/>
        <xs:element name="table" type="table"/>
        <xs:element name="toc" type="toc"/>
        <xs:element name="unorderedList" type="unorderedList"/>
    </xs:choice>
</xs:sequence>
</xs:complexType>

test.xsd namespace - test

<xs:element name="body" type="n:body"/>
  • 我可以添加子元素???

2 个答案:

答案 0 :(得分:1)

当然,为什么不呢。类似的东西:

<xsd:schema
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="urn:m"
    xmlns:m="urn:m"
    xmlns:n="urn:n"
    elementFormDefault="qualified">

    <xsd:import namespace="urn:n" schemaLocation="n.xsd"/>

    <xsd:element name="body" type="n:body"/>

    <xsd:element name="extendedBody" type="m:extendedBody"/>

    <xsd:complexType name="extendedBody">
        <xsd:complexContent>
            <xsd:extension base="n:body">
                <xsd:sequence>
                    <xsd:element name="additionalElement" type="xsd:string"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:schema>

但请注意,XML会像:

<m:extendedBody>
    <n:toc>...</n:toc>
    <m:additionalElement>...</m:additionalElement>
</m:extendedBody>

(虽然我没有检查过解决方案,但这只是为了提出一个想法。很可能混合/选择扩展不起作用。)

答案 1 :(得分:1)

是的,你只需要扩展这样的类型:

<xs:complexType name="moreBodyType">
    <xs:complexContent>
        <xs:extension base="n:body">
            <xs:sequence>
                // put extra child elements here
                                   <xs:element name="morestuff" />
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

现在你可以这样做:

<xs:element name="morebody" type="n:MoreBodyType" />