def xpath *paths
handler = ![
Hash, String, Symbol
].include?(paths.last.class) ? paths.pop : nil
ns = paths.last.is_a?(Hash) ? paths.pop :
(document.root ? document.root.namespaces : {})
return NodeSet.new(document) unless document
sets = paths.map { |path|
ctx = XPathContext.new(self)
ctx.register_namespaces(ns)
path = path.gsub(/\/xmlns:/,'/:') unless Nokogiri.uses_libxml?
ctx.evaluate(path, handler)
}
return sets.first if sets.length == 1
NodeSet.new(document) do |combined|
sets.each do |set|
set.each do |node|
combined << node
end
end
end
end