在data.xml中,目前没有与XML标签上的`xmlns="..."`等效的功能。空命名空间的标签保持原样。
(emit-str {:tag :xmlns.goo/bar
: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属性将会在另一个:xmlns上应用转换,无法区分
- 可忽略的API中断(对于-alpha)
设置:xmlns属性当前用作将属性设置为元数据的快捷方式。
- 是新行为的一个子集,
- 仅在将未命名空间XML嵌入到具有覆盖:xmlns的片段时才会打破(可能性不大),
- 可以通过设置元数据的函数来复制
- 知识迁移自XML语法
因此,应通过设置:xmlns属性来公开动态作用域的默认xmlns功能。
https://dev.clojure.org/display/DXML/Namespaced+XML应更新,以反映此逻辑。
DXML-43已经建议这样做,所以它也将被重新打开。