如何解释XML命名空间规范中的以下内容?
默认名称空间声明适用于其范围内的所有未加前缀的元素名称。默认名称空间声明不直接应用于属性名称;对无前缀属性的解释由它们出现的元素决定。
我的直观理解是,无前缀属性应该被解释为属于它们所属元素的命名空间。但是,以下示例似乎证明了这一点:
架构:
<xs:schema xmlns:myns="http://test.com/xsd/foo" elementFormDefault="qualified"
targetNamespace="http://test.com/xsd/foo" version="1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:attribute name="Id" type="xs:string" />
<xs:element name="Foo">
<xs:complexType>
<xs:attribute ref="myns:Id" />
</xs:complexType>
</xs:element>
</xs:schema>
通过验证的示例:
<a:Foo xmlns:a="http://test.com/xsd/foo" a:Id="123" />
验证失败的示例:
<Foo xmlns="http://test.com/xsd/foo" Id="123" />
是什么给出了?
答案 0 :(得分:2)
这里有两个不同的问题。第一个是关于XML,第二个是关于XML Schema(XSD)。
在XML中(具体来说,如XML Namespaces建议中所定义),无前缀属性没有名称空间。一些评论员认为这意味着命名空间是未定义的(即应用程序定义的),但通常和更容易的解释是它是null:没有命名空间。如果在这种情况下要求命名空间URI,大多数API规范将返回null,有些将返回零长度字符串。
在XSD中,全局属性声明在声明它的XML Schema文档的目标命名空间中定义属性,如果包含的模式文档没有指定目标命名空间,则定义在没有命名空间的属性。因此,使用全局属性声明是不常见的。一种常见的技术是声明属性组(有时,属性组包含单个属性);在这些属性组中声明的任何属性都是局部声明而不是全局声明,因此它们不会继承包含模式文档的目标命名空间,除非你说attributeFormDefault =“qualified”,这将是一件相当奇怪的事情。
答案 1 :(得分:0)
似乎属性Id在任何名称空间之外被解释,并且与模式不匹配,因为模式中的属性具有名称空间。但是,如果模式的声明不同,则如下所示:
<xs:schema xmlns:myns="http://test.com/xsd/foo" elementFormDefault="qualified" targetNamespace="http://test.com/xsd/foo" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Foo">
<xs:complexType>
<xs:attribute name="Id" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:schema>
先前无效的文档有效,反之亦然。原因似乎是XML Schema定义了ettribute的名称空间由其父targetNamespace
元素的<schema>
属性定义,或者如果没有,则没有目标名称空间。在后一种情况下,父级是<complexType>
而不是<schema>
,因此该属性不会获得命名空间。
然而,关于原始问题中无前缀属性的解释的注释仍然令人费解。
答案 2 :(得分:0)
请看我之前发布的类似问题的详细答案:
What is the behavior of getAttributeNS?
除非明确地以前缀为前缀,否则属性没有命名空间。这个想法是,与可以混入其他文档的元素不同,属性实际上只在携带它们的元素的范围内有意义。像xml:lang
这样的例外情况很少,但绝大多数都是逻辑上“范围化”(并因此绑定)他们自己的元素。因此,在您确实需要命名空间之前,没有命名空间。