class REXML::XPathParser
def evaluate_predicate(expression, nodesets)
def evaluate_predicate(expression, nodesets) enter(:predicate, expression, nodesets) if @debug new_nodeset_count = 0 new_nodesets = nodesets.collect do |nodeset| new_nodeset = [] subcontext = { :size => nodeset.size } nodeset.each_with_index do |node, index| if node.is_a?(XPathNode) subcontext[:node] = node.raw_node subcontext[:index] = node.position else subcontext[:node] = node subcontext[:index] = index + 1 end result = expr(expression.dclone, [node], subcontext) trace(:predicate_evaluate, expression, node, subcontext, result) if @debug result = result[0] if result.kind_of? Array and result.length == 1 if result.kind_of? Numeric if result == node.position new_nodeset_count += 1 new_nodeset << XPathNode.new(node, position: new_nodeset_count) end elsif result.instance_of? Array if result.size > 0 and result.inject(false) {|k,s| s or k} if result.size > 0 new_nodeset_count += 1 new_nodeset << XPathNode.new(node, position: new_nodeset_count) end end else if result new_nodeset_count += 1 new_nodeset << XPathNode.new(node, position: new_nodeset_count) end end end new_nodeset end new_nodesets ensure leave(:predicate, new_nodesets) if @debug end