From cb1633e3f763d7630beb7488d36fe738b7d92b71 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 60ae34e7..4ab6b832 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 02cd5056..5103fec0 100644 --- a/lib/rexml/xpath_parser.rb +++ b/lib/rexml/xpath_parser.rb @@ -355,7 +355,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 542bd9d49979c2f39e930c337349cb3088f5e0c0 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 5103fec0..8f9290d6 100644 --- a/lib/rexml/xpath_parser.rb +++ b/lib/rexml/xpath_parser.rb @@ -618,16 +618,13 @@ def evaluate_predicate(expression, nodesets) end 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 == node.position new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) 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 << XPathNode.new(node, position: new_nodeset.size + 1) - end + if result.size > 0 + new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) end else if result