2014-08-28 57 views
0

XML规范指出,非限定名称空间不在命名空间中。规范中的语义是有争议的,但是所有的XML工具集都是以这种方式编写的。请参阅:XML属性命名冲突解决方案

XML Namespaces and Unprefixed Attributes

这是我的潜意识恨了,我的大脑有意识的斗争,以阐述理由的概念。

如果非限定属性不在任何名称空间中,那么验证如何仍然有效?这是一个矛盾。

当范围内有两个同名的属性会发生什么。一个来自默认名称空间,另一个来自当前元素。

<document xmlns="default.ns" xmlns:hr="humanresources.ns"> 
    <hr:user id="abc" /> 
</document> 

如果id在两个default.ns和humanresources.ns但不同的数据类型定义,说xs:tokenxs:integer其命名空间将被id,如果有一个决心进行验证?

假设一个验证器会在模糊性方面出错,并强制其他属性被限定,那么我是否必须编写一个帮助器GetLocalAttribute方法来处理所有这些?

像:

  • ids =选择元素上的所有属性,其中的localName等于id
  • b =从ids其中的名称空间等于元素名称空间选择单个
  • 如果b = NULL {返回b}
  • 否则从ids返回单个名称空间等于空

卢克

+0

Pedantry警报:您并不是唯一不喜欢指定XML名称空间的方式,但您的表征是错误的。 XML规范完全没有提及名称空间。 XML命名空间规范指出,非限定名称不会被符合命名空间的软件认为属于任何命名空间 - 它不*表示它们“不在命名空间中”。而且,XML堆栈中的大多数工具都将不合格的名称视为与所有其他名称空间不同的名称空间。 – 2014-08-28 18:26:39

回答

2

如果id在两个default.nshumanresources.ns但不同的数据类型定义,说xs:tokenxs:integer其命名空间将ID来,如果有一个决心进行验证?

它不会“解决”任何事情。你的示例XML

<document xmlns="default.ns" xmlns:hr="humanresources.ns"> 
    <hr:user id="abc" /> 
</document> 

  • 在命名空间default.ns与当地名document根级元素,
  • 在命名空间humanresources.ns与当地名user一个子元素,用
  • 没有名字空间的本地名称id的属性

这是否有效取决于人力资源模式中user元素类型的定义。如果指定允许user元素的id属性不在名称空间中,那么它是有效的,无论任何模式是否在相应的名称空间中声明名为id的全局属性。

默认情况下,相同规则适用于XML模式中的元素的属性 - 顶级“全局”属性(和元素)声明属于模式的targetNamespace,但是属于(本地)属性(和元素)声明嵌套在complexType中不属于任何名称空间。这可以通过单个声明中的form属性和/或整个模式中的elementFormDefaultattributeFormDefault来控制。所以

<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> 

架构声称,在该模式中的targetNamespace名为没有命名空间id所需的属性user元素,而

<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" /> 
+0

这非常有帮助,谢谢。关于你的第一个模式的例子,在没有命名空间中使用local属性,那么这将验证吗?:'... '这里,'id'是合格的,但如果我理解正确,模式/名称空间中没有“id”属性(仅限本地)。 – 2014-08-28 16:58:13

+0

@LukePuplett不,它不会有效。命名空间是元素或属性名称的一部分,您有时看到的描述这种语法的是'{namespace} localname',这可能是一种更清晰的思考方式(尽管它不是您可以直接在XML中使用的语法)。我的模式的第一个版本需要一个名为'{} id'的属性,但是这个XML具有'{humanresources.ns} id'。 – 2014-08-28 17:21:43