diff --git a/lib/nokogiri/xml/searchable.rb b/lib/nokogiri/xml/searchable.rb index dc203d08b6..f1b720e4cf 100644 --- a/lib/nokogiri/xml/searchable.rb +++ b/lib/nokogiri/xml/searchable.rb @@ -263,11 +263,9 @@ def xpath_internal(node, paths, handler, ns, binds) def xpath_impl(node, path, handler, ns, binds) ctx = XPathContext.new(node) ctx.register_namespaces(ns) - path = path.gsub("xmlns:", " :") unless Nokogiri.uses_libxml? + ctx.register_variables(binds) - binds&.each do |key, value| - ctx.register_variable(key.to_s, value) - end + path = path.gsub("xmlns:", " :") unless Nokogiri.uses_libxml? ctx.evaluate(path, handler) end diff --git a/lib/nokogiri/xml/xpath_context.rb b/lib/nokogiri/xml/xpath_context.rb index 5274a5d709..033af04b02 100644 --- a/lib/nokogiri/xml/xpath_context.rb +++ b/lib/nokogiri/xml/xpath_context.rb @@ -6,9 +6,20 @@ class XPathContext ### # Register namespaces in +namespaces+ def register_namespaces(namespaces) - namespaces.each do |k, v| - k = k.to_s.gsub(/.*:/, "") # strip off 'xmlns:' or 'xml:' - register_ns(k, v) + namespaces.each do |key, value| + key = key.to_s.gsub(/.*:/, "") # strip off 'xmlns:' or 'xml:' + + register_ns(key, value) + end + end + + def register_variables(binds) + return if binds.nil? + + binds.each do |key, value| + key = key.to_s + + register_variable(key, value) end end end