From 14e2a3377bc85e4e30b294b293f48858d776884f Mon Sep 17 00:00:00 2001 From: tompng Date: Sat, 6 Jun 2026 01:40:09 +0900 Subject: [PATCH 1/2] Primitive value should't be wrapped in an array --- lib/rexml/functions.rb | 8 ++++++-- lib/rexml/xpath_parser.rb | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/rexml/functions.rb b/lib/rexml/functions.rb index f9f2166a..e277740d 100644 --- a/lib/rexml/functions.rb +++ b/lib/rexml/functions.rb @@ -74,13 +74,17 @@ def Functions::local_name(node_set=nil) end def Functions::namespace_uri( node_set=nil ) - get_namespace( node_set ) {|node| node.namespace} + get_namespace( node_set ) do |node| + return node.namespace + end + "" end def Functions::name( node_set=nil ) get_namespace( node_set ) do |node| - node.expanded_name + return node.expanded_name end + "" end # Helper method. diff --git a/lib/rexml/xpath_parser.rb b/lib/rexml/xpath_parser.rb index 583f8c74..799ffa59 100644 --- a/lib/rexml/xpath_parser.rb +++ b/lib/rexml/xpath_parser.rb @@ -313,7 +313,7 @@ def expr( path_stack, nodeset, context=nil ) end when :variable var_name = path_stack.shift - return [@variables[var_name]] + return @variables[var_name] when :eq, :neq, :lt, :lteq, :gt, :gteq left = expr( path_stack.shift, nodeset.dup, context ) From 6189869076297d1876f9aac9e6beae7c18183173 Mon Sep 17 00:00:00 2001 From: tompng Date: Sat, 6 Jun 2026 13:32:17 +0900 Subject: [PATCH 2/2] Remove workaround to handle primitive value wrapped in array --- lib/rexml/xpath_parser.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/rexml/xpath_parser.rb b/lib/rexml/xpath_parser.rb index 799ffa59..b97c672e 100644 --- a/lib/rexml/xpath_parser.rb +++ b/lib/rexml/xpath_parser.rb @@ -533,16 +533,13 @@ def evaluate_predicate(expression, nodesets) subcontext[:position] = position result = expr(expression.dclone, [node], subcontext) trace(:predicate_evaluate, expression, node, subcontext, result) if @debug - result = result[0] if result.kind_of? Array and result.length == 1 if result.kind_of? Numeric if result == position new_nodeset << node end elsif result.instance_of? Array - if result.size > 0 and result.inject(false) {|k,s| s or k} - if result.size > 0 - new_nodeset << node - end + if result.size > 0 + new_nodeset << node end else if result