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

时间:2019-06-20 22:25:12

标签: xml xsd xml-parsing xsd-validation xml-validation

我有一个像这样的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引发错误,说它在本地type元素声明的info属性中“无法解析符号'playerInfo'”。 但是,如果我将命名空间别名xmlns:target="http://myns.com"添加到<schema>标记中,然后将该type属性更改为type="target:playerInfo",该错误就会消失。我已经在其他教程中看到了它的完成,所以我知道这是正确的。但是我很困惑:为什么用目标名称空间限定type属性值?全局complexType如何自动与目标名称空间建立连接?据我所知,该模式的默认名称空间是w3.org的路径,那么complexType与目标名称空间有什么关系?

1 个答案:

答案 0 :(得分:1)

这里有两件事要理解。

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

第二,所有引用全局架构组件的属性(例如reftype)都是xs:QName的实例,因此,如果它们没有前缀,则它们表示没有名称空间的名称

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