XML属性命名冲突解决方案

时间:2014-08-28 14:50:27

标签: xml xsd xsd-validation

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:tokenxs:integer哪个命名空间将id解析为验证,如果是吗?

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

像:

  • ids =选择元素所有属性,其中localname等于id
  • b =从ids中选择单个,其中namespace等于元素名称空间
  • if b!= null {return b}
  • else从ids返回单个,其中namespace等于null

1 个答案:

答案 0 :(得分:2)

  

如果iddefault.ns同时定义humanresources.ns,但数据类型不同,请说xs:tokenxs: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属性和/或整个架构上的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>

在架构的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" />