You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Velocity模板中XmlTool遍历DOM节点文本拼接异常求助

解决Velocity XmlTool中节点文本拼接问题

首先,问题的根源在于Velocity Tools 2.0的XmlTool对同名子节点的处理逻辑:当你通过$bar.baz访问节点时,即使当前<bar>下只有一个<baz>,XmlTool也会将其封装为一个节点集合(这是为了兼容多个同名子节点的场景)。直接调用.text属性时,会自动遍历集合中所有节点并拼接它们的文本内容,这就导致了你看到的“拼接所有兄弟节点文本”的问题。

接下来提供几种可行的解决方法:

方法1:通过索引访问集合中的第一个节点

因为每个<bar>下只有一个<baz>和<qux>,你可以直接取集合的第一个元素来获取单个节点的文本:

#if($xml.foo)
 <document>
 #foreach($bar in $xml.foo)
 <repeatableElement>
  <aaa>$bar.baz[0].text</aaa>
  <bbb>$bar.qux[0].text</bbb>
 </repeatableElement>
 #end
 </document>
#end

方法2:使用XmlTool的getChild()方法直接获取单个子节点

XmlTool提供了getChild(String nodeName)方法,它会返回当前节点下第一个匹配名称的子节点(正好符合你的场景),然后调用getText()获取文本:

#if($xml.foo)
 <document>
 #foreach($bar in $xml.foo)
 <repeatableElement>
  <aaa>$bar.getChild("baz").getText()</aaa>
  <bbb>$bar.getChild("qux").getText()</bbb>
 </repeatableElement>
 #end
 </document>
#end

方法3:使用selectSingleNode()精准定位节点

如果你需要更灵活的节点选择,可以用XPath表达式结合selectSingleNode()方法,相对于当前<bar>节点定位子节点:

#if($xml.foo)
 <document>
 #foreach($bar in $xml.foo)
 <repeatableElement>
  <aaa>$bar.selectSingleNode("./baz").text</aaa>
  <bbb>$bar.selectSingleNode("./qux").text</bbb>
 </repeatableElement>
 #end
 </document>
#end

这三种方法都能帮你单独获取每个叶子节点的文本,得到你期望的输出格式。

内容的提问来源于stack exchange,提问作者blackgreen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:33:12