0

我是 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 声明)?

提前致谢!

4

1 回答 1

1

是的,这是可能的。您可能需要阅读的结构是 XSDinclude元素。

如果 Operational 元素及其 StatusType 在命名空间 NS1 的 XSD 模式文档(我们称之为“operational.xsd”)中声明,那么同一命名空间的其他模式文档可以使这些声明成为它们定义的模式的一部分,通过包括对 operation.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 处理器中的一大类错误和处理器之间的互操作性问题。

于 2013-08-12T21:16:14.933 回答