Subject: Re: [xsl] Collect word count with xslt2.0 on saxon 8 From: George Cristian Bina <george@xxxxxxxxxxxxx> Date: Thu, 18 May 2006 10:40:41 +0300 |
Have a look at the built-in template rules http://www.w3.org/TR/xslt#built-in-rule
Best regards, George --------------------------------------------------------------------- George Cristian Bina <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com
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][;])+')[string(.)])"
/>
</count>
</record>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*[contains(@class, 'topic/topic')]" mode="getText"/> </xsl:stylesheet>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Collect word count with x, Karen McAdams | Thread | RE: [xsl] Collect word count with x, Karen McAdams |
RE: [xsl] Need help for XSL beautif, Michael Kay | Date | RE: [xsl] two transformations conse, Michael Kay |
Month |