使用不同命名空间前缀下的 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 reserved。 xml
前缀本身被自动定义为绑定到 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" />
我正在处理使用 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 reserved。 xml
前缀本身被自动定义为绑定到 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" />