Re: [xsl] Applying Templates Up To The Node That Contains The nth Descendant Character

Subject: Re: [xsl] Applying Templates Up To The Node That Contains The nth Descendant Character
From: Evan Lenz <evan@xxxxxxxxxxxx>
Date: Tue, 23 Dec 2008 00:03:28 -0800
Hi Jeff,

If you're not interested in actually truncating the last paragraph, the stylesheet below should do the trick. See the comments for explanation. It will work for any sequence of elements within <body> (not just <p>).

<xsl:stylesheet version="1.0"

 <xsl:template match="body">
   <!-- Process just the first child element -->
   <xsl:apply-templates mode="up-to-1000" select="*[1]"/>

<!-- Recursively process the child elements -->
<xsl:template match="*" mode="up-to-1000">
<xsl:param name="char-count" select="0"/>
<!-- The running character count consists of the count so far
plus the length of the string-value of this element. -->
<xsl:variable name="new-char-count" select="$char-count + string-length(.)"/>

           <!-- Copy this element -->
           <xsl:copy-of select="."/>

<!-- Only process (copy) the next one if we haven't reached 1000 yet -->
<xsl:if test="$new-char-count &lt; 1000">
<xsl:apply-templates mode="up-to-1000" select="following-sibling::*[1]">
<!-- Propagate our running total -->
<xsl:with-param name="char-count" select="$new-char-count"/>


Let me know if you have any questions about the above.


Jeff Sese wrote:

I have a book structure mark-up and I'm trying to get an extract of the book contents to represent a preview. However, I only want to get the contents upto the node that contains the nth descendant character of the book body. How can I do this?

I have:
        <p>some text</p>
        <p>some text</p>
        <p>some text, here is the 1,000th character, some more text</p>
        <p>some text</p>

I want my output to be all the descendant::p of body but only upto the p that contains the 1000th character.

Thanks in advance,

-- Jeff

Current Thread