默认名称空间中的XML属性名称和元素?

时间:2012-06-18 16:17:14

标签: xml xsd xml-namespaces

如何解释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" />

是什么给出了?

3 个答案:

答案 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这样的例外情况很少,但绝大多数都是逻辑上“范围化”(并因此绑定)他们自己的元素。因此,在您确实需要命名空间之前,没有命名空间。