Drools规则中如何用XPath遍历列表匹配DOM节点?
要实现遍历validExpressions列表并匹配任意一个符合条件的表达式,你可以通过结合from语法和eval逻辑来实现。之前的尝试可能是因为没有正确关联Person实例的属性与列表元素的检查逻辑,下面是两种贴合需求的可行方案:
方案1:每匹配到一个有效表达式就触发一次规则
如果需要针对每个符合条件的表达式单独触发规则(比如打印具体匹配的表达式内容),可以用这种写法:
import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import java.util.List; rule "Person Valid Expression Matcher (Per Match)" when // 先获取Person实例,提取需要用到的XPath和DOM对象 $person: Person($xp: xPath, $dom: dom) // 遍历validExpressions列表中的每个字符串表达式 $expr: String() from $person.getValidExpressions() // 检查当前表达式是否能匹配到恰好1个DOM节点(和你原规则的匹配逻辑一致) eval( ((NodeList) $xp.compile($expr).evaluate($dom, XPathConstants.NODESET)).getLength() == 1 ) then System.out.println("MATCHED valid expression: " + $expr); end
方案2:只要存在任意匹配就触发一次规则
如果只需要确认列表中至少有一个表达式符合要求,规则仅触发一次,可以用exists包裹检查逻辑:
import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import java.util.List; rule "Person Valid Expression Matcher (At Least One)" when $person: Person($xp: xPath, $dom: dom) // 检查列表中是否存在至少一个符合条件的表达式 exists( String($expr) from $person.getValidExpressions() eval( ((NodeList) $xp.compile($expr).evaluate($dom, XPathConstants.NODESET)).getLength() == 1 ) ) then System.out.println("At least one valid expression matched!"); end
关键说明
- 先绑定
Person实例并提取xPath和dom属性,既避免了重复获取对象,也确保列表遍历和XPath检查使用的是同一个实例的资源。 from语法专门用于遍历集合类元素,这里用来逐个取出validExpressions中的字符串。eval用于执行自定义的XPath匹配逻辑,你可以根据实际需求调整匹配条件(比如把==1改成>0,允许匹配多个节点)。
内容的提问来源于stack exchange,提问作者ender9994
相关产品推荐
相关产品推荐

