目标是生成在文档根处聚合的命名空间并自定义前缀的 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)}} 运行正常,但现在我想自定义前缀。这里似乎 :attr 似乎没有效果。
`
(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”的 xmlns 绑定固定为 “http://www.w3.org/2000/xmlns/” clojure.core/ex-info
我可以通过将 {{aggregate-xmlns}} 从场景中去除来验证是否生成正确的前缀,但聚合是目标。