我正在处理使用xml:lang的XML文件,现在有人向我发送了一个文件:
<element xmlns:ns1="xml" ns1:lang="fr" />
我应该将此视为与此相同吗?
<element xml:lang="fr" />
或者,当需要xml:lang时,我应该将文件视为无效吗?如果是第一个,我可以在XSD中捕获xml命名空间的“代理”吗?
答案 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 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" />