我也寫過一個使用遞歸的解決方案,但我唯一擔心的是性能,以及是否會有一些內存或一些計算器因爲這一點。我想知道是否有任何解決方案使用< xsl:value-of>或< copy-of>?如果遞歸可以轉換爲循環等,請讓我知道下面的解決方案是否有任何改進。
<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>
是不是不可能在不使用fsxl的情況下實現這一點? – keshav84 2010-07-20 13:49:16
@ keshav.veerapaneni:這是可能的,但這是FXSL的目的:永遠不必手工編寫任何繁瑣的遞歸處理(並可能犯錯誤) - 只需使用存在於您的模板。另外,即使文本長度爲數百萬字符,我的解決方案也不會因堆棧溢出而崩潰。所選擇的模板(請參見''指令中的名稱)使用DVC(分而治之)式遞歸,這保證N = 1000000(1M)時最大遞歸深度僅爲log2(N) - 19。 –
2010-07-20 14:36:41
嗨dimitre,我也寫了一個解決方案,我上面粘貼的反覆,請你建議,如果有任何優化可能溢出它 – keshav84 2010-07-20 17:23:28