【发布时间】:2010-10-22 06:32:43
【问题描述】:
a) 为什么全局元素和属性声明必须始终属于命名空间,因此必须始终在实例文档中进行限定?
b) 本地元素/属性声明(其 form 属性设置为 unqualified)是否仍然是模式的目标命名空间的一部分,即使它们与实例文档中的任何命名空间都没有关联?
c) 即使类型/组声明是全局的,它仍然是目标命名空间的一部分,因此在引用全局声明时,我们必须包含目标命名空间前缀。
无论如何,全局声明是目标命名空间的一部分,而局部声明不是,有什么特别的原因吗?也就是说,即使全局类型/组声明不属于目标命名空间,我们仍然可以在 Xml Schema 中引用它们,所以它们成为命名空间的一部分一定还有其他好处吗?!
谢谢
编辑:
@user437291: 如果你理解 命名空间的概念和 限定名称为什么使用单词 “本地”和“全球”这不是一个 概念的一部分?
但是为什么局部类型声明需要是 Xml Schema 的目标命名空间的成员呢?它们没有从实例文档或其他 Xml 模式中引用,那么它们作为目标命名空间的成员的目的/好处是什么?
此外,问题是否 元素或属性属于 命名空间真的独立于 其“资格”。这是 不同的属性,如颜色和 大小的东西。
一个元素/属性如何属于一个命名空间,同时又不必在实例文档中进行限定?在编程语言中,如果类型T 是命名空间N1 的成员,则意味着它的完全限定名称是N1.T,因此其他类型需要使用完全限定名称N1.T(这里我' m 忽略 using 指令等)。
我希望它与 Xml Schemas 和 xml 实例文档相同 - 因此,据我了解,当 Xml Schema 验证器解析 Contacts.xml 遇到合格元素 contact:firstName 时,它会搜索 Contacts.xsd 以使用匹配的元素声明一个名字http://www.someDomain.com.firstName。
在找到匹配项后,验证器会继续处理Contacts.xml 中的下一个元素,即lastName。看到lastName 元素是unqualified,它在Contacts.xsd 中搜索名为lastName 的元素声明。现在如果在Contacts.xsd 中它的完全限定名称是http://www.someDomain.com.lastName,那么验证器将无法找到匹配的声明!但它确实找到了匹配的声明,所以我假设 lastName 不是命名空间 http://www.someDomain.com 的成员
Contacts.xml
<?xml version="1.0" encoding="UTF-8"?>
<contact:contact
xmlns:contact="http://www.someDomain.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="http://www.someDomain.com contacts1.xsd">
<contact:firstName></contact:firstName>
<lastName></lastName>
</contact:contact>
Contacts.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.someDomain.com" targetNamespace="http://www.someDomain.com" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="contact">
<xs:complexType>
<xs:sequence>
<xs:element name="firstName" />
<xs:element name="lastName" form="unqualified"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
【问题讨论】: