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"))))

`

ExceptionInfo 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](https://clojure.atlassian.net/browse/DXML-55)(glts 报告)
...