From 7a6f34103de55678241471aef582a5aa24622496 Mon Sep 17 00:00:00 2001 From: kou Date: Sun, 22 Apr 2018 09:38:06 +0000 Subject: rexml: Fix XPath bug of //#{ELEMENT_NAME}[#{POSITION}] The position should be counted for each nodeset but the previous implementation counts position for union-ed nodeset. For example, "/a/*/*[1]" should be matched to "" and "" with the following XML. But the previous implementation just returns only "". * lib/rexml/element.rb (REXML::Attributes#each_attribute): Support Enumerator for no block use. * lib/rexml/element.rb (REXML::Attributes#each): Support Enumerator for no block use. * lib/rexml/functions.rb (REXML::Functions.string): Support NaN again. * lib/rexml/xpath_parser.rb: Re-implement "Step" evaluator. It should evaluate "AxisSpecifier", "NodeTest" and "Predicate" in one step to respect position for each nodeset. * test/rexml/test_jaxen.rb: Enable more tests. Remained tests should be also enabled but it'll not be near future. * test/rexml/xpath/test_base.rb: Fix expected value. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63237 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rexml/functions.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'lib/rexml/functions.rb') diff --git a/lib/rexml/functions.rb b/lib/rexml/functions.rb index b0029660fa..452426703c 100644 --- a/lib/rexml/functions.rb +++ b/lib/rexml/functions.rb @@ -154,12 +154,16 @@ module REXML case object when Array string(object[0]) - when Numeric - integer = object.to_i - if object == integer - "%d" % integer + when Float + if object.nan? + "NaN" else - object.to_s + integer = object.to_i + if object == integer + "%d" % integer + else + object.to_s + end end when nil "" -- cgit v1.2.3