Use correct root for preceding/following(-sibling)

This ensures these axes work correctly when scoped to a node instead of a
document.
This commit is contained in:
Yorick Peterse 2014-11-13 01:11:29 +01:00
parent 27ffa4d3d5
commit 01b88d8c68
1 changed files with 28 additions and 4 deletions

View File

@ -364,11 +364,12 @@ module Oga
#
def on_axis_following(ast_node, context)
nodes = XML::NodeSet.new
root = root_node(@document)
context.each do |context_node|
check = false
@document.each_node do |doc_node|
root.each_node do |doc_node|
# Skip child nodes of the current context node, compare all
# following nodes.
if doc_node == context_node
@ -394,12 +395,13 @@ module Oga
#
def on_axis_following_sibling(ast_node, context)
nodes = XML::NodeSet.new
root = parent_node(@document)
context.each do |context_node|
check = false
parent = has_parent?(context_node) ? context_node.parent : nil
@document.each_node do |doc_node|
root.each_node do |doc_node|
# Skip child nodes of the current context node, compare all
# following nodes.
if doc_node == context_node
@ -452,11 +454,12 @@ module Oga
#
def on_axis_preceding(ast_node, context)
nodes = XML::NodeSet.new
root = root_node(@document)
context.each do |context_node|
check = true
@document.each_node do |doc_node|
root.each_node do |doc_node|
# Test everything *until* we hit the current context node.
if doc_node == context_node
break
@ -478,12 +481,13 @@ module Oga
#
def on_axis_preceding_sibling(ast_node, context)
nodes = XML::NodeSet.new
root = parent_node(@document)
context.each do |context_node|
check = true
parent = has_parent?(context_node) ? context_node.parent : nil
@document.each_node do |doc_node|
root.each_node do |doc_node|
# Test everything *until* we hit the current context node.
if doc_node == context_node
break
@ -1755,6 +1759,26 @@ module Oga
def current_node_set
return @node_sets.last
end
##
# Returns the root node of `node`, or `node` itself if its a Document.
#
# @param [Oga::XML::Node|Oga::XML::Document] node
# @return [Oga::XML::Node|Oga::XML::Document]
#
def root_node(node)
return node.respond_to?(:root_node) ? node.root_node : node
end
##
# Returns the parent node of `node`, or `node` itself if its a Document.
#
# @param [Oga::XML::Node|Oga::XML::Document] node
# @return [Oga::XML::Node|Oga::XML::Document]
#
def parent_node(node)
return node.respond_to?(:parent) ? node.parent : node
end
end # Evaluator
end # XPath
end # Oga