在data.xml中,目前没有与XML标签上的`xmlns="..."`等效的功能。空名称空间的标签将保留为空名称空间。
(emit-str {:tag :xmlns.goo/foo
:attrs {:xmlns "goo"}
:content [
{:tag :foo}]})
计算结果为
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo xmlns=\"goo\"><foo xmlns=\"\" xmlns:a=\"goo\"/></foo>"
- 有一个原因:为了解析的xml的完美往返和值相等-
然而,将空名称空间映射到默认名称空间对于许多用例都是有效的,包括
- 符号简略
- 处理HTML解析器的输出
虽然符号简略看起来是一个用例,可能从词法作用域中受益,但是没有明确的使用场景,以及减少在xml片段中使用任意代码的可能性可能使此功能难以使用。
另一方面,处理需要一个动态作用域的转换,而许多符号简略用例也可以使用此方法实现。
所以,实施动态作用域转换的使用场景很好。
至于API,出于几个原因,设置::xmlns属性可能是有吸引力的
- 不与往返干扰
以上,被删除的原因不适用,因为解析器将永远不会产生包含::xmlns属性的片段
- 有限的影响组合性
设置::xmlns属性将与应用动态作用域下的转换区分不开。
- 不可忽略的API破坏(对于 alpha)
设置::xmlns属性目前的用例是将它设置为元数据的快捷方式。
- 是新行为的子集,
- 只在尝试将非命名空间xml嵌入到具有覆盖::xmlns的片段时才会破裂(不太可能),
- 可以通过一个函数来复制,设置元数据
- 知道xml语法
因此,应通过为发射器设置::xmlns属性来公开动态作用域的默认-xmlns功能。
应更新
https://dev.clojure.org/display/DXML/Namespaced+XML,以反映这一理由。
DXML-43已经建议了这一点,因此这也将重新开放。