@@ -670,35 +670,22 @@ impl NamespaceResolver {
670670 }
671671
672672 fn resolve_prefix ( & self , prefix : Option < Prefix > , use_default : bool ) -> ResolveResult < ' _ > {
673- self . bindings
674- . iter ( )
675- // Find the last defined binding that corresponds to the given prefix
676- . rev ( )
677- . find_map ( |n| match ( n. prefix ( & self . buffer ) , prefix) {
678- // This is default namespace definition and name has no explicit prefix
679- ( None , None ) if use_default => Some ( n. namespace ( & self . buffer ) ) ,
680- ( None , None ) => Some ( ResolveResult :: Unbound ) ,
681-
682- // One part has prefix but other is not -> skip
683- ( None , Some ( _) ) => None ,
684- ( Some ( _) , None ) => None ,
685-
686- // Prefixes does not match -> skip
687- ( Some ( definition) , Some ( usage) ) if definition != usage => None ,
688-
689- // Prefixes the same, entry defines binding reset (corresponds to `xmlns:p=""`)
690- _ if n. value_len == 0 => Some ( Self :: maybe_unknown ( prefix) ) ,
691- // Prefixes the same, returns corresponding namespace
692- _ => Some ( n. namespace ( & self . buffer ) ) ,
693- } )
694- . unwrap_or_else ( || Self :: maybe_unknown ( prefix) )
695- }
696-
697- #[ inline]
698- fn maybe_unknown ( prefix : Option < Prefix > ) -> ResolveResult < ' static > {
699- match prefix {
700- Some ( p) => ResolveResult :: Unknown ( p. into_inner ( ) . to_vec ( ) ) ,
701- None => ResolveResult :: Unbound ,
673+ // Find the last defined binding that corresponds to the given prefix
674+ let mut iter = self . bindings . iter ( ) . rev ( ) ;
675+ match ( prefix, use_default) {
676+ // Attribute name has no explicit prefix -> Unbound
677+ ( None , false ) => ResolveResult :: Unbound ,
678+ // Element name has no explicit prefix -> find nearest xmlns binding
679+ ( None , true ) => match iter. find ( |n| n. prefix_len == 0 ) {
680+ Some ( n) => n. namespace ( & self . buffer ) ,
681+ None => ResolveResult :: Unbound ,
682+ } ,
683+ // Attribute or element name with explicit prefix
684+ ( Some ( p) , _) => match iter. find ( |n| n. prefix ( & self . buffer ) == prefix) {
685+ Some ( n) if n. value_len != 0 => n. namespace ( & self . buffer ) ,
686+ // Not found or binding reset (corresponds to `xmlns:p=""`)
687+ _ => ResolveResult :: Unknown ( p. into_inner ( ) . to_vec ( ) ) ,
688+ } ,
702689 }
703690 }
704691
0 commit comments