请分享您的想法,参加 2024年Clojure状态调查!

欢迎!请访问关于页面,了解更多关于这一功能的工作原理。

+1
data.xml

我正在使用clojure.data.xml 0.2.0-alpha6将两个SVG文档合并成一个新的文档。

在这个过程中,我创建了一些新的元素。

我认为我按照c.d.xml README中的说明正确使用了命名空间;例如

(alias-uri 'svg "http://www.w3.org/2000/svg")
(element ::svg/svg {}
  (element ::svg/g {}
    (:content de)))

技术上这 works just fine,但当我使用emit-str(或indent-str)将新文档(根元素)输出为字符串时
的命名空间被分配了一个别名,并且这个别名被用于
整个文档中的所有元素;例如

<a:svg xmlns:a="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1748 1740">
  <a:g>...

在这个例子中,这个别名不是必须的,因为文档中的所有元素都属于
同一个命名空间,因此它可以是默认命名空间。换句话说,我希望输出看起来像这样
或者,如果不能这样,我希望别名是svg而不是a,像这样

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1748 1740">
  <g>...

是否有人知道是否可以通过current

<svg:svg xmlns:svg="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1748 1740">
  <svg:g>...

clojure.data.xml的当前版本简单容易地实现这两种情况中的任何一种?
我已经尝试显式地向根元素添加xmlns属性——这在0.0.8版本中有效,但在0.2.0-alpha6中不可行;有奇怪的事情发生。

我提问这个问题的原因是因为

我很好奇

  1. 如果current
  2. 这不是0.2.0版本中能够实现的,我希望将其变为一个功能请求。

谢谢!

1 答案

+2

选中
 
最佳答案

我惊讶地发现设置根元素的xmlns属性不起作用——这应该足够了。您是否有可复现的情况和看到的输出?

我在tools.deps的pom gen功能中做了类似的事情(使用2.0.0-alpha5,我认为这与alpha6在这方面没有实质性区别):https://github.com/clojure/tools.deps.alpha/blob/master/src/main/clojure/clojure/tools/deps/alpha/gen/pom.clj - 第22行是别名,第70行是设置xmlns。

感谢@alexmiller!这很有趣——我没有想到既要使用命名空间作为元素名称关键词中的命名空间,又要显式地添加`xmlns`属性。根据我之前对XML的广泛经验,我认为在元素上指定命名空间是正确指定XML库(例如StAX)的命名空间的方式,并且它将有自己的API来表示命名空间,当将内存中的文档模型转换为XML文档字符串时。

不知道这是否有意义,但我用0.2.0-alpha6尝试了您的方法,对我有效。谢谢!
这些事情共同工作——只有在命名空间与默认值不同时才需要在元素中使用命名空间,因此设置默认值就可以达到您想要的目标。虽然从语义上看它们“意思”相同(但肯定没有命名空间的那一个可能更符合用户的期望)。
明白了,谢谢!

顺便说一句,这可能值得添加到 README 文件中。有兴趣修一个补丁吗?
如果你想在这里放一个示例,我可以添加一个
...