为什么我需要从本地 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
属性中给出的本地名称。
其次,所有引用全局模式组件的属性,例如 ref
和 type
,都是 xs:QName
的实例,因此,如果它们没有前缀,那么它们代表名称没有命名空间。
因此您的类型具有名称(在 XPath 3.0 表示法中)Q{http://myns.com}playerInfo
,但类型属性扩展为 Q{}playerInfo
。
我有一个这样的 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
属性中给出的本地名称。
其次,所有引用全局模式组件的属性,例如 ref
和 type
,都是 xs:QName
的实例,因此,如果它们没有前缀,那么它们代表名称没有命名空间。
因此您的类型具有名称(在 XPath 3.0 表示法中)Q{http://myns.com}playerInfo
,但类型属性扩展为 Q{}playerInfo
。