class Nokogiri::XML::Node

Monkey patch for Nokogiri to cache xpath contexts and make things faster under jRuby

Public Instance Methods

xpath(*paths) click to toggle source
# File lib/gdor/indexer/nokogiri_xml_node_mixin.rb, line 7
def xpath(*paths)
  return NodeSet.new(document) unless document

  paths, handler, ns, binds = extract_params(paths)

  sets = paths.map do |path|
    # if self.contexts[path]
    #  ctx = self.contexts[path]
    # else
    if @context
      ctx = @context
    else
      ctx = XPathContext.new(self)
      @context = ctx
    end
    ctx.register_namespaces(ns)
    path = path.gsub(/xmlns:/, ' :') unless Nokogiri.uses_libxml?
    binds.each do |key, value|
      ctx.register_variable key.to_s, value
    end if binds
    ctx.evaluate(path, handler)
  end

  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