In XSLT 1.0, you can only capture an output and apply templates to that output is if you are using a processor that supports the node-set()
function. Assuming that you are, you can do something like this:
<xsl:if test="$item/tcm:Content/em:Office/em:Address">
<address>
<xsl:variable name="addressHtml">
<xsl:apply-templates mode="renderhtml"
select="$item/tcm:Content/em:Office/em:Address/node()" />
</xsl:variable>
<xsl:apply-templates select="msxsl:node-set($addressHtml)"
mode="adjustAddressHtml" />
</address>
</xsl:if>
...
<xsl:template match="@* | node()" mode="adjustAddressHtml" name="Identity">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="adjustAddressHtml" />
</xsl:copy>
</xsl:template>
<xsl:template match="/" mode="adjustAddressHtml">
<xsl:if test="p">
<xsl:call-template name="Identity" />
</xsl:if>
<xsl:if test="not(p)">
<xsl:call-template name="StartingP" />
</xsl:if>
</xsl:template>
<xsl:template match="/p[1]" mode="adjustAddressHtml" name="StartingP">
<p property="v:street-address">
<xsl:apply-templates select="@* | node()" mode="adjustAddressHtml" />
</p>
</xsl:template>