我想创建一个包含文本值的变量,该文本值是多个空格字符,但字符数直到运行时才知道。这需要做很多次,所以我想使用一些性能很好的东西。
一种选择是在先前声明的节点上使用 substring() 函数,但这会将长度限制为不超过原始文本的长度。
另一种方法是使用带有 concat() 函数的递归模板,但不确定性能影响。
有什么方法可以很好地做到这一点?
您可以使用递归和分而治之。这将为您提供订单的运行时成本(log N)。或者,如果您的 XSLT 处理器实现了尾端递归优化,那么您可以使用尾端递归解决方案来提高规模上的安全性。这是两个解决方案...
<xsl:template name="spaces">
<xsl:param name="count" />
<xsl:choose>
<xsl:when test="$count <= 10">
<xsl:value-of select="substring(' ',1,$count)" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="spaces">
<xsl:with-param name="count" select="$count idiv 2" />
</xsl:call-template>
<xsl:call-template name="spaces">
<xsl:with-param name="count" select="$count - ($count idiv 2)" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="spaces">
<xsl:param name="count" />
<xsl:choose>
<xsl:when test="$count <= 10">
<xsl:value-of select="substring(' ',1,$count)" />
</xsl:when>
<xsl:otherwise>
<xsl:text> </xsl:text>
<xsl:call-template name="spaces">
<xsl:with-param name="count" select="$count - 10" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我会创建一个长度为 4000 个空格的全局变量。然后如果所需的字符串少于 4000 个空格,请使用 substring(); 如果更大,请使用 Durkin 概述的递归方法。当然,在 2.0 中,代码编写起来要简单得多,但选择一种性能良好的方法仍然是一个有趣的小问题。
有关高效(时间和空间)的 XSLT 1.0 解决方案,请参见: