| Subject: [xsl] XSLT 1.0 Stack Overflow Question From: "Roger L. Cauvin" <roger@xxxxxxxxxx> Date: Fri, 13 Jul 2007 12:40:06 -0500 | 
I'm parsing raw text (not XML or a node-set) that contains a long list of
items separated by linefeeds.  Let's say it's a list of action items:
  Action Items
  1. Ensure all tests pass.
  2. Get sign-off on documentation from Amy.
  3. Create a new page on web site for product.
  4. Move product from staging area to production.
  .
  .
  .
  205. Send press release announcing release.
What I want to do is find the item with the greatest number of characters in
it.  So I have a recursive template:
  <xsl:template name="get-longest-item">
    <xsl:param name="items"/>
    <xsl:variable name="index">
      <xsl:value-of select="substring-before(substring-after($items,
'
'), '.')"/>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="$index = ''">
        <xsl:text disable-output-escaping="yes">-1%-1</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="item">
          <xsl:value-of select="substring-before(substring-after($items, '.
'), '
')"/>
        </xsl:variable>
        <xsl:variable name="length" select="string-length($item)"/>
        <xsl:variable name="longest-of-rest">
          <xsl:call-template name="get-longest-item">
            <xsl:with-param name="items" select="substring-after($items,
'
')" />
          </xsl:call-template>
        </xsl:variable>
        <xsl:choose>
          <xsl:when test="$length > substring-after($longest-of-rest,
'%')">
            <xsl:value-of select="concat($index, '%', $length)" />
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$longest-of-rest" />
          </xsl:otherwise>
        </xsl:choose>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
The template "returns" the index of the longest item, followed by the
percent symbol, followed by the length of that item.
For a large list of action items, applying this template results in a stack
overflow.  A binary divide-and-conquer approach would make much more
efficient use of stack space, but I can't figure out how to do it using XSLT
1.0.  I try to cut the text into two halves, but doing so inevitably seems
to involve order N recursion.
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] XSL-FO plain text process, Kai Hackemesser | Thread | RE: [xsl] XSLT 1.0 Stack Overflow Q, Michael Kay | 
| Re: [xsl] Clientside XSLT Transform, Manfred Staudinger | Date | Re: [xsl] Clientside XSLT Transform, Andrew Welch | 
| Month |