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)}} 运行正常,但现在我想自定义前缀。这里似乎 :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}} 从场景中去除来验证是否生成正确的前缀,但聚合是目标。

3 个答案

0

评论者:bendlas

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

0
评论者:glts_

顺便说一句,不确定为什么 {{aggregate-xmlns}} 总是为累积的命名空间生成新的前缀?难道不是应该尽可能保留遇到的前缀吗?

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