1

我在嵌套 XSD 时遇到问题。我有我的文档结构的 MAIN 文件,它具有相同的 HEADer(我想将它分开 - 效果很好)并且我想要有几个主体,这取决于它的内容。我的问题是如何以正确的方式连接它?

主.XSD:

<xs:schema id="MAIN" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns=""> 
  <xs:include schemaLocation="HEAD.xsd"/>

  <xs:element name="MAIN">
    <xs:complexType>
      <xs:sequence minOccurs="1" maxOccurs="1">
        <xs:element name="HEAD" type="HEADType"/>
        <xs:element name="BODY" type="BODYType"/>
      </xs:sequence> 
    </xs:complexType> 
  </xs:element>
</xs:schema>

头.XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="HEAD" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" >
  <xs:complexType name="HEADType">
    <xs:all minOccurs="1" maxOccurs="1">
      <xs:element name="USER"> 
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="[A-Z_]+"></xs:pattern>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:all>
  </xs:complexType>
</xs:schema>

我的想法是:

  1. 将 MAIN.xsd 中的“MAIN”元素作为 MAINTYPE 的类型,然后将 MAIN.XSD 包含到已定义 BODYType 的 BODY_CUSTOMER 中。
  2. 分别加载 MAIN.xsd 和 BODY_CUSTOMER.xsd,然后它会找到 BODYType 的定义。

但是,我认为这不是“正确”的做法。

4

1 回答 1

2

根据您的描述,您尝试实现的内容通俗地称为“悬空定义”。

这种方法最常见的问题是典型的 XSD 模式编辑器会在您尝试编辑 Main.xsd 时抱怨缺少定义

您的第一个想法有点令人困惑;不过,我认为不需要仅仅因为第二个确实是你需要做的。我认为虽然separately指的是不同的文件,但您必须同时加载它们。你将如何做到这一点取决于需要使用 XSD 的工具,所以我无法真正帮助你。

假设 .NET,如果您在XmlSchemaSet对象中一次加载 3 个 XSD 文件(Main、Head 和 Body_Customer),它将完全按照您的意愿工作。

As to "proper".... it is all depending on what is accepted or not as an XSD practice in your organization. As far as I am concerned, dangling types is a perfectly valid XSD design pattern.

于 2013-01-07T21:11:25.010 回答