【问题标题】:Is using the xml namespace under a different namespace prefix the same?在不同的命名空间前缀下使用 xml 命名空间是否相同?
【发布时间】:2017-06-13 12:00:32
【问题描述】:

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

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

我应该把这个和这个一样对待吗?

<element xml:lang="fr" /> 

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

【问题讨论】:

    标签: xml xsd xml-namespaces


    【解决方案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前缀,而不是命名空间。根据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的概念。

    【讨论】:

      【解决方案2】:

      没有。

      背景: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" /> 
      

      【讨论】:

        猜你喜欢
        • 2019-07-14
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 2016-12-17
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        相关资源
        最近更新 更多