【问题标题】:XML attribute naming collision resolutionXML 属性命名冲突解决
【发布时间】:2014-08-28 14:50:26
【问题描述】:

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:token 和 xs:integer 将解析到哪个命名空间 id 进行验证,如果有的话?

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

喜欢:

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

卢克

【问题讨论】:

  • Pedantry 警告:不喜欢 XML 命名空间的指定方式的不止您一个人,但您的描述是错误的。 XML 规范完全没有提到命名空间。 XML 命名空间规范说,不合格的名称不会被命名空间兼容的软件识别为属于任何命名空间——它确实不说它们“不在命名空间中”。 XML 堆栈中的大多数工具都将非限定名称视为位于与所有其他名称不同的名称空间中。

标签: xml xsd xsd-validation


【解决方案1】:

如果id 在default.ns 和humanresources.ns 中都定义了但具有不同的数据类型,比如xs:token 和xs:integer 将解析到哪个命名空间进行验证,如果有的话?

它不会“解决”任何问题。您的示例 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 的全局属性,它都是有效的 is对应的命名空间。

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

<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 中声明一个user 元素,并带有一个名为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" />

【讨论】:

  • 这很有帮助,谢谢。关于上面没有命名空间中的本地属性的第一个模式示例,那么这是否有效?:... &lt;hr:user hr:id="abc" /&gt; 在这里,id 是合格的,但如果我理解正确,模式/命名空间中没有 id 属性(只有本地)。
  • @LukePuplett 不,它是无效的。命名空间是元素或属性名称的一部分,您有时会看到描述它的语法是{namespace}localname,这可能是一种更清晰的思考方式(尽管它不是您可以直接在 XML 中使用的语法)。我的第一个模式版本需要一个名为 {}id 的属性,但这个 xml 有 {humanresources.ns}id 代替。
猜你喜欢
  • 2011-01-31
  • 2017-05-31
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2019-01-25
相关资源
最近更新 更多