2

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

是什么赋予了?

4

3 回答 3

2

这里有两个单独的问题。第一个是关于 XML,第二个是关于 XML Schema (XSD)。

在 XML 中(具体而言,如 XML 命名空间建议中所定义),无前缀属性不在命名空间中。一些评论员将此解释为名称空间未定义(即应用程序定义),但通常且更简单的解释是它为空:没有名称空间。如果您在这种情况下请求命名空间 URI,大多数 API 规范将返回 null,有些将返回零长度字符串。

在 XSD 中,全局属性声明在声明它的 XML 模式文档的目标命名空间中定义一个属性,或者如果包含的模式文档未指定目标命名空间,则在无命名空间中定义一个属性。出于这个原因,使用全局属性声明是不常见的。一种常见的技术是声明属性组(有时,属性组包含单个属性);在此类属性组中声明的任何属性都是局部声明而不是全局声明,因此它们不会继承包含模式文档的目标命名空间,除非您说 attributeFormDefault="qualified",这将是一件相当奇怪的事情。

于 2012-06-18T17:29:03.263 回答
0

似乎属性 Id 在任何命名空间之外解释并且与架构不匹配,因为架构中的属性具有命名空间。但是,如果 schema 声明不同,如下所示:

<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>,因此该属性没有获得命名空间。

然而,我原来的问题中关于解释无前缀属性的注释仍然令人费解。

于 2012-06-18T16:17:14.827 回答
0

查看我之前发布的类似问题的详细答案:

getAttributeNS 的行为是什么?

属性没有命名空间,除非明确地以 1 为前缀。这个想法是,与可以混入其他文档的元素不同,属性实际上只在携带它们的元素的范围内才有意义。很少有例外,xml:lang但绝大多数在逻辑上都被(并因此绑定到)他们拥有的元素“限定”。因此在你真正需要之前没有命名空间。

于 2012-06-18T16:47:32.983 回答