Я также написал решение с использованием рекурсии ранее, но меня беспокоило только производительность, и если из-за этого будет какая-то память или какой-то стекопоток.Мне было интересно, будет ли какое-либо решение с использованиемили же?Также, пожалуйста, дайте мне знать, есть ли какие-либо улучшения в приведенном ниже решении, если рекурсия может быть преобразована в цикл и т. Д.
<xsl:template match="text()" mode="literalHTML">
<xsl:variable name="txt" select="."/>
<xsl:value-of select="smc:escapeChar(smc:escapeChar(smc:escapeChar($txt,'&','&amp;'),'<','&lt;'),'>','&gt;')"/>
</xsl:template>
<xsl:function name="smc:escapeChar">
<xsl:param name="txt"/>
<xsl:param name="char"/>
<xsl:param name="subs"/>
<xsl:result>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test="contains($txt, $char)">
<xsl:variable name="after" select="substring-after($txt,$char)"/>
<xsl:value-of select="substring-before($txt,$char)"/>
<xsl:value-of select="$subs"/>
<xsl:value-of select="smc:escapeChar($after,$char,$subs)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$txt"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$result"></xsl:value-of>
</xsl:result>
</xsl:function>