to prvo ne radi, zato što taj select upoređuje @id atribut svake reči sa @name atributom iste reči, pa to neće nikad da poleti.. ;)
drugim rečima, moraš explicitno da navedeš da se @name ne odnosi na context node unutar xpath izraza već na tekući node unutar XSLTa. koliko ja poznajem XSLT (ne mnogo), ne znam za elegantniji način od ovog tvog..
a za bonus, select sa NSom je prost:
/lang:main/word[@id=$name], stim da moraš prvo da registruješ "lang" NS prefix, jer se upoređivanje ne vrši sa prefixom, već sa kompletnim NSom (u prevodu,
/x:main/word[@id=$name] je potpuno ekvivalentno prethodnom selectu ako je "x" prefix registrovan ka istom NSu kao i "lang" prefix u target xml dokumentu)
e sad, kako se u XPATHu registruju NS prefixi već zavisi od implementacije ili konkretne tehnologije u okviru koje se xpath koristi. pošto se ti zanimaš XSLTom, trebalo bi da je dovoljno da u XSL šablonu (recimo u root elementu) definišeš sve NS prefixe koje ćeš koristiti u XPATHu..
ili alternativno, imaš local-name() i namespace-uri() funkcije u XPATHu..