3

我想创建一个包含文本值的变量,该文本值是多个空格字符,但字符数直到运行时才知道。这需要做很多次,所以我想使用一些性能很好的东西。

一种选择是在先前声明的节点上使用 substring() 函数,但这会将长度限制为不超过原始文本的长度。

另一种方法是使用带有 concat() 函数的递归模板,但不确定性能影响。

有什么方法可以很好地做到这一点?

4

3 回答 3

0

您可以使用递归和分而治之。这将为您提供订单的运行时成本(log N)。或者,如果您的 XSLT 处理器实现了尾端递归优化,那么您可以使用尾端递归解决方案来提高规模上的安全性。这是两个解决方案...

对于非尾端递归优化 XSLT 处理器...

<xsl:template name="spaces">
  <xsl:param name="count" />
  <xsl:choose>
    <xsl:when test="$count &lt;= 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>

对于尾端递归优化 XSLT 处理器...

<xsl:template name="spaces">
  <xsl:param name="count" />
  <xsl:choose>
    <xsl:when test="$count &lt;= 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>
于 2012-11-06T04:34:23.317 回答
0

我会创建一个长度为 4000 个空格的全局变量。然后如果所需的字符串少于 4000 个空格,请使用 substring(); 如果更大,请使用 Durkin 概述的递归方法。当然,在 2.0 中,代码编写起来要简单得多,但选择一种性能良好的方法仍然是一个有趣的小问题。

于 2012-11-06T08:54:05.613 回答
0

有关高效(时间和空间)的 XSLT 1.0 解决方案,请参见:

http://www.sourceware.org/ml/xsl-list/2001-07/msg01040.html

于 2012-11-06T14:16:09.707 回答