在其他XSD中重用1 XSD中定义的复杂类型

时间:2013-08-12 16:39:28

标签: xsd global code-reuse

我是XML模式的新手,并希望重用特定的复杂类型,并且它在多个XSD文件中全局关联简单类型。下面是我想在全球范围内使用的一大堆代码:

    <element name="Operational">
            <complexType>
            <sequence>
                <element name="Status" type="StatusType"/>
                <element name="Description" type="string"/>
            </sequence>
            </complexType>
    </element>

.
.
.

<simpleType name="StatusType">
    <restriction base="string">
        <enumeration value="Success"/>
        <enumeration value="Error"/>
        <enumeration value="Warning"/>
        <enumeration value="Other"/>
    </restriction>
</simpleType>

如果可能的话,你能告诉我吗?如果是这样,我怎么能这样做,以便我可以引用/调用这个复杂类型(和相关的StatusType声明)?

提前致谢!

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。您可能需要阅读的构造是XSD include元素。

如果在名称空间NS1的XSD架构文档(我们称之为'operational.xsd')中声明了Operational元素及其StatusType,那么同一名称空间的其他模式文档可以使这些声明成为模式的一部分。通过包含对operational.xsd的引用来定义。在简单的情况下,我们可能会:

<!--* don't do this at home, at least not this way ... *-->
<xsd:schema xmlns:xsd="..." 
            xmlns:tns="NS1"
            targetNamespace="NS1" >
  <xsd:include schemaLocation="operational.xsd"/>
  <xsd:element name="e" type="tns:StatusType"/>
  <xsd:complexType name="t">
    <xsd:sequence>
      <xsd:element ref="tns:Operational"/>
    </xsd:sequence>
  </xsd:complexType>
  <!--* these aren't useful declarations, they just
      * illustrate the syntax. *-->
</xsd:schema>

在多个地方多次包含同一模式文档是创建互操作性问题的好方法,因此实际上应该避免使用上面说明的简单模式,而不是更冗长但更不容易出错:

  • 区分两类架构文档:普通架构文档和驱动程序文档。
  • 以任何有用的方式将声明分组到普通模式文档中。
  • 普通模式文档可能需要导入其他名称空间,但是当它们执行时,它们永远不应该为该其他名称空间指定模式位置,只需指定名称空间名称。
  • 普通模式文档不应包含任何xsd:include元素。
  • 驱动程序文档导入并包含应组合的任何模式文档,以形成用于给定目的的模式。与普通模式文档不同,驱动程序文档在其xsd:import元素上指定模式位置。

这有助于确保不会导入或包含多次特定架构文档,从而消除了XSD处理器中的大量错误以及处理器之间的互操作性问题。