有没有一种从子节点访问父节点的优雅方式?
不适用于以流方式生成 XML 的 MarkupBuilder(在调用嵌套闭包之前,它已经将父元素的开始标记写入输出流)。但是您可以使用DOMBuilder在内存中构建 DOM 树,然后使用 DOM API 填充总数,最后将包含总数属性的 DOM 树序列化:
import groovy.xml.*
import groovy.xml.dom.*
import org.w3c.dom.*
def dom = DOMBuilder.newInstance(false, true)
Element parent = dom.parent() {
child(duration:'1')
child(duration:'2')
}
use(DOMCategory) {
parent.setAttributeNS(null, "totalDuration",
parent.xpath('sum(child/@duration)'))
}
def xmlString = XmlUtil.serialize(parent)
只要您不使用闭包mkp.yield
或mkp.yieldUnescaped
在闭包内, DOMBuilder 应该与 MarkupBuilder 一样工作。如果您需要使用这些,那么您必须构建没有totalDuration
属性的 XML 字符串,然后将其重新解析为 DOM,添加额外的属性并重新序列化。