normalize-whitespace does not remove all whitespace: it removes leading and trailing whitespace, and replaces internal sequences of whitespace characters with a single space.
In 2.0 you can trim trailing whitespace using
replace($in, "\s*$", "")
In 1.0, I think you'll need to write a recursive template that tests the last character to see if it's a space (substring($in, string-length($in), 1)) and if so, strips it off and recurses.
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference