为什么扩展只能放在simpleContent和complexContent容器中?

Kev*_*n K 5 xsd

我很难理解用于在XSD中定义类型扩展和限制的格式的一些细微差别.根据W3Schools的参考:

  • simpleContent 定义"对纯文本复杂类型或简单类型的扩展或限制作为内容,不包含任何元素"
  • complexContent 定义"仅包含混合内容或元素的复杂类型的扩展或限制

我不清楚的是,为什么XSD要求扩展和限制包含在其中一个容器中,此外,为什么只有扩展和限制需要它.如果必须在容器中定义所有"内容",对我来说会更有意义,但事实并非如此 - 对于基类型,内容(sequences等)被定义为complexType容器的直接子项.

就拿这个例子中,这对我来说似乎过于冗长:

<xs:complexType name="fullpersoninfo">
  <xs:complexContent>
    <xs:extension base="personinfo">
      <xs:sequence>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="city" type="xs:string"/>
        <xs:element name="country" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

为什么不能这样写呢?

<xs:complexType name="fullpersoninfo">
  <xs:extension base="personinfo">
    <xs:sequence>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:extension>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

或者甚至喜欢这个?

<xs:complexType name="fullpersoninfo" extends="personinfo">
  <xs:sequence>
    <xs:element name="address" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

我假设必须有某种原因它被定义的方式,但我找不到任何关于为什么的线索.

C. *_*een 4

我认为您不会为复杂类型的 XML 语法找到任何有用的设计原理。我只想说,那些设计 XML 语法的人通过您提到的元素来解决一些技术困难,并且没有明显更好的语法在工作组中取得共识。您可能想知道 simpleContent 和 complexContent 解决了哪些技术难题,这是一个合理的问题,但我怀疑是否有人愿意深入研究 XSD 的设计记录,这是回答这个问题所必需的。

一个简单的观察:扩展和限制的合法子级会根据父级是 simpleContent 还是 complexContent 而有所不同。这是使用 simpleContent 和 complexContent 类型的本地声明来完成的,没有它们就不可能实现 — 至少在没有对 XML 语法进行非常彻底的重新设计的情况下是不可能的。