2024 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于页面 了解此功能的工作方式的相关信息。

0
data.xml

目标是生成带有文档根处聚合的命名空间以及自定义前缀的 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}} 的情况下,确实生成了正确的前缀 —— 但聚合是目标。

3 个答案

0

评论者:bendlas

好的,感谢报告!我会稍后查看。

0
评论者:glts_

顺便问一下,不确定为什么 {{aggregate-xmlns}} 总是为聚合的命名空间生成新的前缀?不是最好尽可能保留遇到的域名吗?

也就是说,如果树中某处存在一个元素 {{<foo:x xmlns:foo="http://foo" />}},我期望这个命名空间以前缀{{foo}}的形式聚合在根节点上……这样emit将自动生成预期的前缀。
0
by
参考: https://clojure.atlassian.net/browse/DXML-55 (由glts报告)
...