Для этого вам, вероятно, необходимо использовать функцию расширения, а именно функцию набор узлов , которая возвращает набор узлов из фрагмента дерева результатов.
Сначала вам нужно определить пространство имен для функций расширения, например:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
В этом случае я использую функции расширения Microsoft, но другие доступны в зависимости от используемой платформы. (http://exslt.org/common является еще одним распространенным для платформ, не принадлежащих Microsoft).
Затем вы можете получить доступ к элементам вашей переменной следующим образом (в качестве примера)
<xsl:apply-templates select="msxsl:node-set($aTree)/foos/foo"/>
Совокупность всего этого в простом примере дает вам
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:variable name="mytree">
<foos>
<foo>bar1</foo>
<foo>bar2</foo>
<foo>bar3</foo>
<foo>bar4</foo>
</foos>
</xsl:variable>
<xsl:template match="/">
<xsl:call-template name="myTemplate">
<xsl:with-param name="aTree" select="$mytree"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="myTemplate">
<xsl:param name="aTree"/>
<newfoos>
<xsl:apply-templates select="msxsl:node-set($aTree)/foos/foo"/>
</newfoos>
</xsl:template>
<xsl:template match="foo">
<newfoo>
<xsl:value-of select="text()"/>
</newfoo>
</xsl:template>
</xsl:stylesheet>
При запуске просто выводится следующий результат:
<newfoos>
<newfoo>bar1</newfoo>
<newfoo>bar2</newfoo>
<newfoo>bar3</newfoo>
<newfoo>bar4</newfoo>
</newfoos>
Учитывая этот пример, нет никаких причин, по которым вы не можете сначала динамически создать переменную myTree .