在不同的命名空间前缀下使用xml命名空间是一样的吗?

时间:2017-06-13 12:00:32

标签: xml xsd xml-namespaces

我正在处理使用xml:lang的XML文件,现在有人向我发送了一个文件:

<element xmlns:ns1="xml" ns1:lang="fr" /> 

我应该将此视为与此相同吗?

<element xml:lang="fr" /> 

或者,当需要xml:lang时,我应该将文件视为无效吗?如果是第一个,我可以在XSD中捕获xml命名空间的“代理”吗?

2 个答案:

答案 0 :(得分:1)

你给出的两个例子并不等同。命名空间是一个URI,这样的URI可以绑定到前缀,用于定义元素和属性的完全限定名称。 URI不需要指向现有资源,并且不希望XML处理器对URI进行任何形式的解析或以其他方式创建它的一些规范表示(除了一些属性值规范化)。实际上,命名空间实际上只是一个区分大小写的字符串,但URI恰好被选为其表示。

换句话说,这个

<element xmlns:ns1="xml" ns1:lang="fr" /> 

将前缀ns1绑定到名称空间xml(这不是合法的URI引用)。然后,lang属性位于名称空间xml中,因为它符合ns1前缀。

那么为什么这与你的第二个例子不一样呢?因为在

<element xml:lang="fr" /> 

xml前缀,而不是命名空间。根据{{​​3}}。

,此前缀隐式绑定到名称空间http://www.w3.org/XML/1998/namespace

进一步查看该规范,您还会发现不仅不允许将xml前缀绑定到任何其他命名空间(有意义),而且您也不允许绑定{{ 1}}命名空间到任何其他前缀(没有多大意义,但允许一些XML处理优化和假设)。

总之,如果需要http://www.w3.org/XML/1998/namespace属性,则应将第一个输入视为无效,因为该属性不存在。构建该文件的人无法理解XML名称空间。

我更深入地研究概念specification regarding reserved prefixes and namespace names

答案 1 :(得分:1)

没有

背景: xml:lang attribute在W3C XML建议书中定义,不依赖于XML命名空间,尽管它使用了冒号(:)。在W3C XML命名空间建议书中,xml前缀(以及以xml开头的所有名称空间前缀)均为declared to be reservedxml前缀本身会自动定义为绑定到http://www.w3.org/XML/1998/namespace

因此,xml:lang="fr"完全正确,可以在不声明xml名称空间前缀的情况下使用。如果您确实要声明xml名称空间前缀,那么它将是xmlns:xml=http://www.w3.org/XML/1998/namespace

此外,xmlns:ns1="xml" ns1:lang="fr"暗示可以传递分配名称空间前缀声明,从而暗示对名称空间前缀声明的误解;他们不能。

所以虽然

<element xmlns:ns1="xml" ns1:lang="fr" />

格式良好(见well-formed vs valid),它不等同于

<element xml:lang="fr" />