Если случается, что вам нужно такое поведение в преобразовании, это означает, что вам, вероятно, придется изменить его общий «дизайн». Также трудно получить то, что вы пытаетесь сделать, не показывая ваш входной документ и желаемый результат.
Поскольку вы не можете обновлять переменные, вы должны переосмыслить свой код. Шаблон (который я могу представить), ближайший к вашему запросу, выглядит примерно так:
<xsl:template match="/">
<xsl:variable name="topLevelHeadings" select="//w:body/w:p
[w:pPr[w:pStyle[@w:val='Heading1']]]"/>
<xsl:variable name="beforeHeading">
<xsl:choose>
<xsl:when test="$topLevelHeadings">
<xsl:value-of select="true()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="false()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- your choose staff -->
<!-- for instance -->
<xsl:if test="$beforeHeading='true'">
<xsl:message>pass</xsl:message>
</xsl:if>
</xsl:template>