Ticket #30 (closed defect: fixed)
Xpath parser bug causing each_element('tag') to fail.
| Reported by: | lucas@… | Owned by: | ser |
|---|---|---|---|
| Priority: | high | Milestone: | 3.1.4 |
| Component: | DOM | Version: | 3.1.2 |
| Severity: | major | Keywords: | |
| Cc: | Ruby version: | 1.8.2 | |
| Operating system: | Linux |
Description (last modified by ser) (diff)
test case :
def test_xpathbug
require 'rexml/document'
d = REXML::Document.new("<tag1 xmlns='ns1'><tag2 xmlns='ns2'/><tada>xa</tada></tag1>")
x = d.root
num = 0
x.each_element('tada') { num += 1 }
assert_equal(1, num)
end
The bug is located in the XPathParser class, method expr, in the :qname case. This version fixes it :
when :qname
#puts "IN QNAME"
prefix = path_stack.shift
name = path_stack.shift
default_ns = @namespaces[prefix]
default_ns = default_ns ? default_ns : ''
nodeset.delete_if do |node|
ns = default_ns
# FIXME: This DOUBLES the time XPath searches take
ns = node.namespace( prefix ) if node.node_type == :element and ns == ''
#puts "NS = #{ns.inspect}"
#puts "node.node_type == :element => #{node.node_type == :element}"
if node.node_type == :element
#puts "node.name == #{name} => #{node.name == name}"
if node.name == name
#puts "node.namespace == #{ns.inspect} => #{node.namespace == ns}"
end
end
!(node.node_type == :element and
node.name == name and
node.namespace == ns )
end
node_types = ELEMENTS
Change History
Note: See
TracTickets for help on using
tickets.
