嵌套的XSD定义

时间:2013-01-07 14:12:06

标签: xml xsd

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

MAIN.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>

HEAD.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的定义。
  3. 但是,我不认为这是“正确”的方式。

1 个答案:

答案 0 :(得分:2)

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

此方法最常见的问题是,当您尝试编辑Main.xsd时,典型的XSD架构编辑器会抱怨缺少定义

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

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

关于“正确”......这完全取决于您组织中的XSD实践所接受的内容。就我而言,悬空类型是一种完全有效的XSD设计模式。