Saxon-EE, with schema-awareness switched on, will check your select expressions and match patterns against the schema. However, it requires a bit more tweaking than you suggest.
Writing <xsl:template match="/my:fakeRoot">
won't be rejected, even though there is no fakeRoot element in your schema, because it's perfectly legitimate for a stylesheet to create elements that aren't valid against the schema and then process them (perhaps to make them valid). It will be rejected, however, if you write it as <xsl:template match="/schema-element(my:fakeRoot)">
because then you're writing a pattern that will only match elements defined in the schema. Similarly an expression like $x//svg:polygno (with a misspelled element name) will be rejected only if the type of $x is declared, e.g. using as="schema-element(svg)"
There's a new option in XSLT 3.0 (new draft just out) (not yet implemented in Saxon)
which will cause <xsl:template match="/my:fakeRoot">
to have the same meaning as <xsl:template match="/schema-element(my:fakeRoot)">
, and therefore to be rejected if there's no element of this name in the schema. And of course it will also work on more complex patterns, for example match="table/td" will be rejected if td cannot appear as a child of table.
My experience of using schema-aware stylesheet development is that it can make debugging an awful lot easier, especially if you are working with a very complex vocabulary. However, there is an up-front cost in declaring all your types, and this means many people are not getting the full benefits. Hopefully the new options will make it more accessible.