diff --git a/lib/rexml/element.rb b/lib/rexml/element.rb
index a002db07..7ce03df6 100644
--- a/lib/rexml/element.rb
+++ b/lib/rexml/element.rb
@@ -1268,6 +1268,22 @@ def [](name_or_index)
# document.root.attribute("x") # => x='x'
# document.root.attribute("x", "a") # => a:x='a:x'
#
+ # This method matches +namespace+ loosely. An unprefixed attribute is
+ # taken to be in the default namespace, and a +namespace+ that no prefix
+ # is bound to falls back to the unprefixed attribute:
+ #
+ # xml_string = ""
+ # document = REXML::Document.new(xml_string)
+ # document.root.attribute("a", "ns0") # => a='a'
+ # document.root.attribute("a", "nosuch") # => a='a'
+ #
+ # The XML Namespaces specification says that an unprefixed attribute has
+ # no namespace, so neither of those should match.
+ # REXML::Attributes#get_attribute_ns follows the XML Namespaces
+ # specification and returns +nil+ for both; use it when you need the
+ # namespace to be matched strictly. The looser behavior here is kept for
+ # compatibility.
+ #
def attribute( name, namespace=nil )
prefix = namespaces.key(namespace) if namespace
prefix = nil if prefix == 'xmlns'
@@ -2493,6 +2509,18 @@ def delete_all( name )
# attrs.get_attribute_ns('http://foo', 'att') # => foo:att='1'
# attrs.get_attribute_ns('http://foo', 'nosuch') # => nil
#
+ # +namespace+ is matched as the XML Namespaces specification defines it,
+ # where an unprefixed attribute has no namespace of its own and does not
+ # take the default one:
+ #
+ # xml_string = ""
+ # attrs = REXML::Document.new(xml_string).root.attributes
+ # attrs.get_attribute_ns('ns0', 'a') # => nil
+ # attrs.get_attribute_ns('', 'a') # => a='a'
+ #
+ # REXML::Element#attribute matches more loosely and returns the attribute
+ # for both of those.
+ #
def get_attribute_ns(namespace, name)
each_effective_attribute.find do |attribute|
if attribute.namespace_declaration?