Use nested node stacks for predicates.
This ensures the current context node is set correctly when using the "self" axis inside a path that's inside a predicate, e.g. foo/bar[baz/. = "something"] Here the "self" axis should refer to foo/bar/baz, _not_ foo/bar.
This commit is contained in:
parent
2b96d65103
commit
e858b54c58
|
@ -66,7 +66,7 @@ module Oga
|
||||||
#
|
#
|
||||||
def initialize(document, variables = {})
|
def initialize(document, variables = {})
|
||||||
@document = document
|
@document = document
|
||||||
@nodes = []
|
@nodes = [[]]
|
||||||
@variables = variables
|
@variables = variables
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -147,6 +147,7 @@ module Oga
|
||||||
def on_path(ast_node, context)
|
def on_path(ast_node, context)
|
||||||
nodes = XML::NodeSet.new
|
nodes = XML::NodeSet.new
|
||||||
|
|
||||||
|
with_node_stack do
|
||||||
ast_node.children.each do |test|
|
ast_node.children.each do |test|
|
||||||
nodes = process(test, context)
|
nodes = process(test, context)
|
||||||
|
|
||||||
|
@ -156,6 +157,7 @@ module Oga
|
||||||
context = nodes
|
context = nodes
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return nodes
|
return nodes
|
||||||
end
|
end
|
||||||
|
@ -1733,7 +1735,25 @@ module Oga
|
||||||
# @return [Mixed]
|
# @return [Mixed]
|
||||||
#
|
#
|
||||||
def with_node(node)
|
def with_node(node)
|
||||||
@nodes << node
|
node_stack << node
|
||||||
|
|
||||||
|
retval = yield
|
||||||
|
|
||||||
|
node_stack.pop
|
||||||
|
|
||||||
|
return retval
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Adds a new stack for storing context nodes and yields the supplied
|
||||||
|
# block.
|
||||||
|
#
|
||||||
|
# The return value of this method is whatever the supplied block returns.
|
||||||
|
#
|
||||||
|
# @return [Mixed]
|
||||||
|
#
|
||||||
|
def with_node_stack
|
||||||
|
@nodes << []
|
||||||
|
|
||||||
retval = yield
|
retval = yield
|
||||||
|
|
||||||
|
@ -1748,6 +1768,13 @@ module Oga
|
||||||
# @return [Oga::XML::Node]
|
# @return [Oga::XML::Node]
|
||||||
#
|
#
|
||||||
def current_node
|
def current_node
|
||||||
|
return node_stack.last
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# @return [Array]
|
||||||
|
#
|
||||||
|
def node_stack
|
||||||
return @nodes.last
|
return @nodes.last
|
||||||
end
|
end
|
||||||
end # Evaluator
|
end # Evaluator
|
||||||
|
|
Loading…
Reference in New Issue