3. Have derived.xsl be created from base.xsl through an XSLT
transformation. This is similar to the previous solution but completely
eliminates the import relationship between derived.xsl and base.xsl.
Overriding behavior is not done through language mechanisms but by
rewriting XSLT code.
4. Functions as wrappers around templates. The file base.xsl contains:
... do the actual work ...
Whoever wants to override what the function foo does overrides the
template named foo. So derived.xsl contains:
... do the customized work ...
... use <xsl:apply-imports/> as needed ...
The downside of this solution is that it requires base.xsl to be
modified. Which means that whoever is responsible for it must agree to
make the changes.
Solution 4 is the one I prefer right now.