Subject: Re: count number of <P>s
From: "Joerg Heinicke" <joerg.heinicke@xxxxxx>
Date: Fri, 5 Apr 2002 08:41:42 +0200
|
> 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
|