为什么我需要从本地 XSD 元素的 "type" 属性限定命名内容类型?

Why do I need to qualify a named content type from the "type" attribute of a local XSD element?

我有一个这样的 XSD 文件:

<schema xmlns="https://www.w3.org/2001/XMLSchema"
    targetNamespace="http://myns.com"
    elementFormDefault="qualified">

  <complexType name="playerInfo">
    <sequence>
      <element name="level" type="integer" />
    </sequence>
  </complexType>

  <element name="player">
    <complexType>
      <sequence>
        <element name="name" type="string" />
        <element name="info" type="playerInfo" />
      </sequence>
    </complexType>
  </element>

</schema>

现在我的 IDE 抛出一个错误,在本地 info 元素声明的 type 属性中说 "cannot resolve symbol 'playerInfo'"。 但是,如果我将命名空间别名 xmlns:target="http://myns.com" 添加到 <schema> 标记,然后将 type 属性更改为 type="target:playerInfo",错误就会消失。我在其他教程中看到过它,所以我知道它是正确的。但我很困惑:为什么要用目标名称空间限定 type 属性值?全局 complexType 是如何自动与目标命名空间建立连接的?据我所知,模式的默认命名空间是 w3.org 的路径,那么 complexType 与目标命名空间有什么关系?

这里有两点需要理解。

首先,所有全局模式组件都有一个 QName 名称,它包含包含模式文档的 targetNamespace 以及 name 属性中给出的本地名称。

其次,所有引用全局模式组件的属性,例如 reftype,都是 xs:QName 的实例,因此,如果它们没有前缀,那么它们代表名称没有命名空间。

因此您的类型具有名称(在 XPath 3.0 表示法中)Q{http://myns.com}playerInfo,但类型属性扩展为 Q{}playerInfo