请在 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
by
参考资料: https://clojure.atlassian.net/browse/DXML-55(由glts报告)
...