Your XML doesn't appear to be properly formed for a start. I don't see why a simple recursive template couldn't do the trick.
In my example I've used the input data:
<SettleList>
<SettleObject>
<ExternalVar>3</ExternalVar>
</SettleObject>
<SettleObject>
<ExternalVar>5</ExternalVar>
</SettleObject>
<SettleObject>
<ExternalVar>10</ExternalVar>
</SettleObject>
<SettleObject>
<ExternalVar>14</ExternalVar>
</SettleObject>
</SettleList>
When running this script:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SettleObject[ExternalVar=5]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="SettleObject[ExternalVar=10]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="SettleObject">
<SettleObject>
<ExternalVar>0</ExternalVar>
</SettleObject>
</xsl:template>
I get this output:
<SettleList>
<SettleObject>
<ExternalVar>0</ExternalVar>
</SettleObject>
<SettleObject>
<ExternalVar>5</ExternalVar>
</SettleObject>
<SettleObject>
<ExternalVar>10</ExternalVar>
</SettleObject>
<SettleObject>
<ExternalVar>0</ExternalVar>
</SettleObject>
</SettleList>
Is this the output you desire?