Don't use for-each, simply use recursion:
Code:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="mf xsd"
version="2.0">
<xsl:output indent="yes"/>
<xsl:function name="mf:create-elements" as="element()*">
<xsl:param name="element-names" as="xsd:string*"/>
<xsl:if test="$element-names[1]">
<node name="{$element-names[1]}">
<xsl:sequence select="mf:create-elements($element-names[position() gt 1])"/>
</node>
</xsl:if>
</xsl:function>
<xsl:template name="main">
<xsl:sequence select="mf:create-elements(tokenize('root1/root2/root3', '/'))"/>
</xsl:template>
</xsl:stylesheet>
I used a function as it is more elegant in my view but feel free to use a template.