I just almost believe the viewpoint in other replies before I test.
It can really run well like that. xslt processor is saxon-he 9.8.0.12
my code :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
exclude-result-prefixes="xs map"
version="2.0">
<xsl:template match="/">
<xsl:variable name="i1" select="123" as="xs:integer"/>
<xsl:variable name="s1" select="'abcd'" as="xs:string"/>
<xsl:variable name="d1" select="234.5" as="xs:float"/>
<!-- we test that variable v1 can be assignment multi times and it is ok. -->
<xsl:variable name="v1" select="$i1"/>
v1 is: <xsl:value-of select="$v1"/>
<xsl:variable name="v1" select="$s1"/>
v1 is: <xsl:value-of select="$v1"/>
<xsl:variable name="v1" select="$d1"/>
v1 is: <xsl:value-of select="$v1"/>
<xsl:variable name="map1" select="map{'haha':119, 'good':110}"/>
<xsl:variable name="map2" select="map:put($map1, 'go', 122)"/>
<xsl:variable name="map1" select="map:put($map2, 'hello', 999)"/>
map1(haha) is <xsl:sequence select="$map1?haha"/>
map1(hello) is <xsl:sequence select="$map1?hello"/>
</xsl:template>
</xsl:stylesheet>
the result screenshort of the running
as your question, you can do like that:
<xsl:variable name="variable2" select="'N'" />
<xsl:variable name="variable2" select="hello:func1()" />
<xsl:function name="hello:func1" as="xl:string">
.....
<xsl:when test="@tip = '2' and $variable2 != 'Y'">
<xsl:value-of select="'Y'" />
</xsl:when>
</xsl:function>