如何编写允许包含整个XML文档的XSD?

时间:2013-12-13 10:48:08

标签: xml xsd

我在下面的表格中有一个XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="my/sample/namespace" 
           xmlns="my/sample/namespace">
    <xs:element name="Root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Child1" type="Child1TYPE" />
                <xs:element name="Child2" type="Child2TYPE" />
            </xs:sequence>
        </xs:complesType>
    <xs:element>

    <xs:simpleType name="Child1TYPE">
        .
        .
        .
</xs:schema>

我想在另一个XML文档中使用此模式包含整个XML文档。这个第二个XML文档的模式是什么样的?我的文档应该如下:

<ContainerDoc xmlns="my/containerdoc/namespace">
    <s:Root xmlns:s="my/sample/namespace">
        <s:Child1>
            .
            .
            .
        </s:Child1>
    </s:Root>
<ContainerDoc>

我尝试过类似的事情:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="my/containerdoc/namespace" 
           xmlns="my/containerdoc/namespace">
    <xs:element name="ContainerDoc">
        <xs:element name="s:Root" 
                    xmlns:s="my/sample/namespace" />
    </xs:element>
</xs:schema>

但是,显然,这是无效的XSD(我不能在Root元素的元素名称中使用s命名空间。这是否可以在XSD中使用?

1 个答案:

答案 0 :(得分:2)

是的,可以编写一个允许包含由另一个XSD定义的整个XML文档的XSD:

  • 如果XSD具有相同的命名空间,请使用xs:include
  • 如果XSD具有不同的命名空间,请使用xs:import

以下是一个完整的工作示例,说明如何将xs:import与来自不同名称空间的XSD一起使用,以及一个对这些XSD有效的XML文档实例:

此XSD(try.xsd):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="my/sample/namespace"
           xmlns="my/sample/namespace"
           elementFormDefault="qualified">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Child1" type="Child1TYPE" />
        <xs:element name="Child2" type="Child2TYPE" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="Child1TYPE">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:simpleType name="Child2TYPE">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
</xs:schema>

可以通过此XSD导入(try2.xsd):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="my/containerdoc/namespace"
           xmlns="my/containerdoc/namespace">
  <xs:import namespace="my/sample/namespace" schemaLocation="try.xsd"/>
  <xs:element name="ContainerDoc">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="s:Root" xmlns:s="my/sample/namespace" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

这个XML文档实例:

<?xml version="1.0" encoding="UTF-8"?>
<ContainerDoc xmlns="my/containerdoc/namespace"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="my/containerdoc/namespace try2.xsd">
  <s:Root xmlns:s="my/sample/namespace">
    <s:Child1/>
    <s:Child2/>
  </s:Root>
</ContainerDoc>

有效。