XML规范说不合格的命名空间没有命名空间。规范中的语义是值得商榷的,但所有XML工具集都是以这种方式编写的。参见:
XML Namespaces and Unprefixed Attributes
这是一个概念,我的潜意识讨厌我有意识的大脑努力表达的原因。
如果非限定属性不在任何命名空间中,那么验证如何仍然有效?这是一个矛盾。
当范围内有两个同名属性时会发生什么。一个来自默认命名空间,一个属于当前元素。
<document xmlns="default.ns" xmlns:hr="humanresources.ns">
<hr:user id="abc" />
</document>
如果在default.ns和humanresources.ns中定义了id
但数据类型不同,请说xs:token
和xs:integer
哪个命名空间将id
解析为验证,如果是吗?
假设验证器会在ambuiguity上出错并强制其他属性被限定,那么我是否必须编写一个帮助器GetLocalAttribute方法来处理所有这些?
像:
ids
=选择元素所有属性,其中localname等于id
b
=从ids
中选择单个,其中namespace等于元素名称空间b
!= null {return b
} ids
返回单个,其中namespace等于null 路
答案 0 :(得分:2)
如果
id
和default.ns
同时定义humanresources.ns
,但数据类型不同,请说xs:token
和xs:integer
哪个命名空间将被解析为验证,如果是吗?
不会“解决”任何事情。您的示例XML
<document xmlns="default.ns" xmlns:hr="humanresources.ns">
<hr:user id="abc" />
</document>
具有
document
中具有本地名称default.ns
的根级元素,带user
中具有本地名称humanresources.ns
的单个子元素,带id
的属性这是否有效取决于人力资源模式中user
元素类型的定义。如果指定user
元素允许id
属性不在命名空间中,则无论是否任一模式声明名为id
的全局属性,它都是有效的是在相应的命名空间中。
默认情况下,相同的规则适用于属性和XML模式中的元素 - 顶级“全局”属性(和元素)声明属于模式的targetNamespace,但是“local”属性(和元素)声明是嵌套的complexType内部不属于任何名称空间。这可以使用单个声明上的form
属性和/或整个架构上的elementFormDefault
和attributeFormDefault
来控制。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
targetNamespace="humanresources.ns" xmlns:tns="humanresources.ns">
<xs:element name="user">
<xs:complexType>
<xs:attribute name="id" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:schema>
在架构的user
中声明targetNamespace
元素,在无名称空间中具有名为id
的必需属性,而
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
targetNamespace="humanresources.ns" xmlns:tns="humanresources.ns">
<xs:attribute name="id" type="xs:string" />
<xs:element name="user">
<xs:complexType>
<xs:attribute ref="tns:id" />
</xs:complexType>
</xs:element>
</xs:schema>
(在顶层声明属性)意味着user
元素需要id
名称空间中的humanresources.ns
属性,即
<hr:user hr:id="abc" />