Using C#'s XSLT function overrides and XElement has really simplified the code. I'm also happy that I've gotten rid of a big "reimplemented wheel" that the last iteration had (implementing CSS generically) since I get lost in the stupid details of getting those "right".
And since you can pull in XSLT functions through packages, that means I can easily write a package that provides "soundex()" or "stem()" or "part-of-speech()" to look for more complex items.