目标是生成带有文档根处聚合的命名空间以及自定义前缀的 XML。data.xml 为此提供了 {{aggregate-xmlns}}。不幸的是,这似乎与 xmlns 前缀 {{:attrs}} 冲突。
要重现此问题,首先设置一些测试数据
`
(xml/alias-uri 'foo "http://foo", 'bar "http://bar")
(def document
(xml/element ::foo/x {}
(xml/element ::bar/y {} "...")))
`
使用 {{(xml/aggregate-xmlns document)}} 进行命名空间聚合时一切正常,但现在我想自定义前缀。这里的 {{:attrs}} 似乎没有任何效果
`
(xml/emit-str
(-> (xml/aggregate-xmlns document)
(assoc-in [:attrs :xmlns/bar] "http://bar")
(assoc-in [:attrs :xmlns/foo] "http://foo")))
`
`
<?xml version="1.0" encoding="UTF-8"?>
<a:x xmlns:a="http://foo" xmlns:b="http://bar">
<b:y>...</b:y>
</a:x>
`
将 {{aggregate-xmlns}} 放在最后会引发异常
`
(xml/emit-str
(xml/aggregate-xmlns
(-> document
(assoc-in [:attrs :xmlns/bar] "http://bar")
(assoc-in [:attrs :xmlns/foo] "http://foo"))))
`
异常信息:林声明前缀的 xmlns 绑定被固定为 `http://www.w3.org/2000/xmlns/` clojure.core/ex-info
我可以验证在不使用 {{aggregate-xmlns}} 的情况下,确实生成了正确的前缀 —— 但聚合是目标。