RE: [xsl] Collect word count with xslt2.0 on saxon 8

Subject: RE: [xsl] Collect word count with xslt2.0 on saxon 8
From: "Karen McAdams" <kamcadam@xxxxxxxxx>
Date: Wed, 17 May 2006 13:02:20 -0700
Hi George-

Thanks for the code sample. I would like to better understand how this
apply-templates works-
   <xsl:template match="*[contains(@class, 'topic/topic')]"
     mode="getText"/>
       <xsl:apply-templates mode="getText" select="node()"/>

It seems that the template rule would remove the node from the source at the
processing context yet with the apply templates it actually retrieves it-
could you elaborate on this approach - I also need to remove from the node
comment elements  before I count the text contents of the node -

If I add an template
<xsl:template match="draft-comment"  mode="getText"/>

I get  -
BUILD FAILED
java.lang.StackOverflowError

( I am building with Ant but this is an xsl related error . )

Karen

------------------------------

Date: Tue, 16 May 2006 10:04:22 +0300
To:  xsl-list@xxxxxxxxxxxxxxxxxxxxxx
From: George Cristian Bina <george@xxxxxxxxxxxxx>
Subject: Re: [xsl] Collect word count with xslt2.0 on saxon 8
Message-ID: <44697976.1000108@xxxxxxxxxxxxx>

Hello Karen,

You can get the count of words more easily than that. First you can get
the text in a variable that belongs to an element with topic/topic but
not to other elements inside it with the same mark and then just count
the words in that.
For getting the text once we match on a topic/topic element we use a new
mode for apply-template on which we do nothing on elements with
topic/topic thus we exclude their text content.

The following stylesheet shows that

<xsl:stylesheet version="2.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
   <xsl:output indent="yes"/>
   <xsl:template match="/">
     <counts>
       <xsl:apply-templates/>
     </counts>
   </xsl:template>
   <xsl:template match="text()"/>
   <xsl:template match="*[contains(@class, 'topic/topic')]">
     <xsl:variable name="text">
       <xsl:apply-templates mode="getText" select="node()"/>
     </xsl:variable>
     <record>
       <text>
         <xsl:value-of select="$text"/>
       </text>
       <count>
         <xsl:value-of
 
select="count(tokenize(lower-case($text),'(\s|[,.!:;]|[n][b][s][p][;])+')[str
ing(.)])"
         />
       </count>
     </record>
     <xsl:apply-templates/>
   </xsl:template>

   <xsl:template match="*[contains(@class, 'topic/topic')]"
     mode="getText"/>
</xsl:stylesheet>

Current Thread