I've done something like this to count words (courtesy of somebody from this
list):
<xsl:variable name="sql"><xsl:value-of select="RowSource"
/></xsl:variable>
<xsl:variable name="x" select="normalize-space($sql)" />
<xsl:variable name="y" select="translate($sql, ' ', '')" />
<xsl:variable name="wc" select="string-length($x) -
string-length($y) +1" />
wc = word count.
Quoting Vasu Chakkera <vasucv(_at_)hotmail(_dot_)com>:
Try this
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:call-template name = "find-words-count">
<xsl:with-param name = "text" select = "/poem/hey_diddle"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="find-words-count">
<xsl:param name="text"/>
<xsl:value-of select = "$text"/>
<hr/>
<xsl:variable name = "text-without-punctuations">
<xsl:call-template name = "remove-punctuations">
<xsl:with-param name = "text" select = "$text"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="count-words">
<xsl:with-param name="text"
select="$text-without-punctuations"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="text-string"/>
<xsl:param name="find-word"/>
<xsl:param name="replace-with"/>
<xsl:choose>
<xsl:when test="contains($text-string,$find-word)">
<xsl:call-template name="replace">
<xsl:with-param name="text-string"
select="concat(substring-before($text-string,$find-word),$replace-with,substring-after($text-string,$find-word))"/>
<xsl:with-param name="find-word" select="$find-word"/>
<xsl:with-param name="replace-with"
select="$replace-with"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text-string"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="remove-punctuations">
<xsl:param name="text"/>
<xsl:variable name = "remove-newlines">
<xsl:call-template name = "replace">
<xsl:with-param name = "text-string" select = "$text"/>
<xsl:with-param name = "find-word" select = "'
'"/>
<xsl:with-param name = "replace-with" select = "' '"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name = "remove-fullstops">
<xsl:call-template name = "replace">
<xsl:with-param name = "text-string" select =
"$remove-newlines"/>
<xsl:with-param name = "find-word" select = "'.'"/>
<xsl:with-param name = "replace-with" select = "' '"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name = "remove-commas">
<xsl:call-template name = "replace">
<xsl:with-param name = "text-string" select =
"$remove-fullstops"/>
<xsl:with-param name = "find-word" select = "','"/>
<xsl:with-param name = "replace-with" select =
"' '"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name = "remove-question-marks">
<xsl:call-template name = "replace">
<xsl:with-param name = "text-string" select =
"$remove-commas"/>
<xsl:with-param name = "find-word" select = "'?'"/>
<xsl:with-param name = "replace-with" select = "' '"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name = "remove-excl-marks">
<xsl:call-template name = "replace">
<xsl:with-param name = "text-string" select =
"$remove-question-marks"/>
<xsl:with-param name = "find-word" select = "'!'"/>
<xsl:with-param name = "replace-with" select = "' '"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name = "remove-multiple-spaces">
<xsl:call-template name = "replace">
<xsl:with-param name = "text-string" select =
"$remove-excl-marks"/>
<xsl:with-param name = "find-word" select =
"' '"/>
<xsl:with-param name = "replace-with" select = "' '"/>
</xsl:call-template>
</xsl:variable>
<hr/>
<xsl:value-of select = "normalize-space($remove-multiple-delims)"/>
</xsl:template>
<xsl:template name="count-words">
<xsl:param name="text"/>
<xsl:param name="count" select="1"/>
<xsl:choose>
<xsl:when test="contains($text,' ')">
<xsl:variable name = "new-text" select =
"substring-after($text,' ')"/>
<xsl:call-template name = "count-words">
<xsl:with-param name = "text" select = "$new-text"/>
<xsl:with-param name="count" select="$count+1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select = "$count"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
You could store every template defined above except the first one in a file
called utils.xsl and use it.
Hope this helps
Vasu
From: "Karl J. Stubsjoen" <karl(_at_)meetscoresonline(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Subject: [xsl] Count Words
Date: Sun, 8 Aug 2004 13:18:41 -0700
Hello,
Given the following:
=========== xml source ==========
<poem>
<hey_diddle>
Hey diddle diddle, the cat and the fiddle,
The cow jumped over the moon,
The little dog laughed to see such sport,
And the dish ran away with the spoon.
</hey_diddle>
</poem>
=========== /xml source ==========
How do I count how many words are contained within the node <hey_diddle/>?
Karl
--+------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--
_________________________________________________________________
Express yourself with cool new emoticons http://www.msn.co.uk/specials/myemo
--+------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--
O SAPO já está livre de vírus com a Panda Software, fique você também!
Clique em: http://antivirus.sapo.pt