There are various things in XSLT which might help, but none is a easy solution.
Firstly, Saxon is available in .Net as well as Java, so you might consider restricting your targets to Saxon only. This would also give you the ability to use XSLT 2.0, which is a big improvement over XSLT 1.0 If this really isn't an option then you will need to code against this.
One way would be to write your own extension method in .Net, and then write some simple XSLT, using the function-available() function to determine if one of the three options is available.
Code:
<xsl:choose>
<xsl:when test="function-available('saxon:evaluate')">
<xsl:value-of select="saxon:evaluate($xpath)"/>
</xsl:when>
<xsl:when test="function-available('dyn:evaluate')">
<xsl:value-of select="dyn:evaluate($xpath)"/>
</xsl:when>
<xsl:when test="function-available('myext:evaluate')">
<xsl:value-of select="dyn:evaluate($xpath)"/>
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="yes">Unsupported XSLT processor.</xsl:message>
</xsl:otherwise>
</xsl:when>
Basic implementations of evaluate in C# can be found here:
http://stackoverflow.com/questions/2...piledtransform. Others may exist, I didn't look for long.
Another final option is to explain how you want to use the evaluate() function, and maybe there is actually a way to do this without using evaluate() at all.