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

Is using the xml namespace under a different namespace prefix the same?

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

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

我应该把这个当作等于这个吗?

<element xml:lang="fr" /> 

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

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

也就是说,这个

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

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

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

<element xml:lang="fr" /> 

xml 前缀 ,不是命名空间。根据 specification regarding reserved prefixes and namespace names.

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

进一步查看该规范,您还会发现不仅不允许将 xml 前缀绑定到任何其他名称空间(有意义),而且还不允许绑定http://www.w3.org/XML/1998/namespace 命名空间到任何其他前缀(意义不大,但允许一些 XML 处理优化和假设)。

总而言之,如果需要 xml:lang 属性,您应该将第一个输入视为无效,因为其中不存在该属性。构建该文件的人未能理解 XML 个命名空间。

我更深入地研究了这些概念 in this answer

没有

背景: xml:lang attribute is defined in the W3C XML Recommendation without dependence on XML namespaces, despite its use of a colon (:). In the W3C XML Namespaces Recommendation, the xml prefix (and all namespace prefixes beginning with xml) are 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" />