XSLT 2.0 Решение:
<xsl:variable name="firstPassResult">
<xsl:apply-templates select="/" mode="firstPass"/>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="$firstPassResult" mode="secondPass"/>
</xsl:template>
Хитрость здесь в том, чтобы использовать mode = "firstPassResult" для первого прохода, в то время как все шаблоны для прохода sedond должны иметь mode = "secondPass".
Edit:
Пример:
<root>
<a>Init</a>
</root>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="firstPassResult">
<xsl:apply-templates select="/" mode="firstPass"/>
</xsl:variable>
<xsl:template match="/" mode="firstPass">
<test>
<firstPass>
<xsl:value-of select="root/a"/>
</firstPass>
</test>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="$firstPassResult" mode="secondPass"/>
</xsl:template>
<xsl:template match="/" mode="secondPass">
<xsl:message terminate="no">
<xsl:copy-of select="."/>
</xsl:message>
</xsl:template>
</xsl:stylesheet>
Выход:
[xslt] <test><firstPass>Init</firstPass></test>
Таким образом, первый проход создает некоторые элементы с содержимым root / a, а второй выводит созданные элементы в стандартный вывод. Надеюсь, этого достаточно, чтобы вы пошли.