The Lurker
An error is an error
When Saxon reports an XSLT error to Cocoon, what does Cocoon do? It buries the error message in the stupid LogKit log file (which are, completely idiotically, written into the webapp's WEB-INF directory), and instructs Saxon to continue processing. Not surprisingly, when you try to call a named template that doesn't exist — an error Saxon helpfully reported much earlier — Saxon throws a mystifying NullPointerException.
If XSLT processing wasn't going to fail, Saxon wouldn't have called it an error, would it? And of course, despite being built on the Avalon component architecture, Cocoon's worthless error handler is instantiated half way through a private method and thus impossible to override without making your own copy of the class and replacing the single offending line.
*sigh*
All timestamps are Melbourne time.