This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: count number of <P>s
- From: "Joerg Heinicke" <joerg dot heinicke at gmx dot de>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Fri, 5 Apr 2002 08:41:42 +0200
- Subject: Re: [xsl] count number of <P>s
- References: <CC12DACC-4816-11D6-8110-0030658FD82E@cederholm.tv>
- Reply-to: xsl-list at lists dot mulberrytech dot com
> I'm trying to count the number of <P> tags withing a <![CDATA[ section.
>
> Doing this:
> <xsl:value-of select="string-length(.) - string-length(translate(.,
> '<P>', ''))"/>
>
> almost gets me there -- but counts each instance of <, P, and >
> separately. Is there a way of searching for an *entire* string,
> rather than individual characters?
Hello Dan,
my approach is to use a recursive template:
<xsl:template match="element-with-cdata">
<xsl:call-template name="string-count">
<xsl:with-param name="string" select="."/>
<xsl:with-param name="string-to-count" select="'<P>'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="string-count">
<xsl:param name="string"/>
<xsl:param name="string-to-count"/>
<xsl:param name="count" select="0"/>
<xsl:choose>
<xsl:when test="contains($string, $string-to-count)">
<xsl:call-template name="string-count">
<xsl:with-param name="string"
select="substring-after($string, $string-to-count)"/>
<xsl:with-param name="string-to-count"
select="$string-to-count"/>
<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>
(untested)
This template tests whether the string contains the string to count. When
this is true, the string is shortened til the first occurence of the
string-to-count, the counter is incremented and the template calls itself
again. If string-to-count is not more contained in string then the value of
the count will be returned.
But a question I would ask earlier: Do you really need CDATA? Why not using
"normal" XML? If it is poor HTML, you can use Tidy to transform it to
XHTML/XML. Then counting nodes would be much easier than string
manipulation.
Regards,
Joerg
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list