|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: counting specific nodes
Here is another solution --
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan">
<xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>
<xsl:variable name="startpos">1</xsl:variable>
<xsl:template match="/vs">
<xsl:variable name="dots">
<xsl:for-each select="ve">
<xsl:variable name="val"
select="substring(@pos,1,1)"/>
<xsl:if test="($val = $startpos) or ($val >
$startpos)">
<xsl:call-template name="countdots">
<xsl:with-param name="stringparam" select="@pos"/>
<xsl:with-param name="noofdots" select="0"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:variable>
Answer - <xsl:value-of
select="count(xalan:nodeset($dots)/a)" />
</xsl:template>
<xsl:template name="countdots">
<xsl:param name="stringparam"/>
<xsl:param name="noofdots"/>
<xsl:variable name="sbst"
select="substring-after($stringparam, '.')"/>
<xsl:if test="$sbst != '' ">
<xsl:call-template name="countdots">
<xsl:with-param name="stringparam" select="$sbst"/>
<xsl:with-param name="noofdots" select="$noofdots +
1"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$sbst = '' ">
<xsl:if test="$noofdots = 3">
<a/>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
At the begining of XSL, a varibale is declared to
mention the starting position; <xsl:variable
name="startpos">1</xsl:variable>
The XSL uses recursion to find the count of the
desired nodes. The above XSL creates a tag <a/> each
time it encounters a node in original XML having 3
dots (whose position is, on or after the "startpos"
value node). A variable "dots" ( declared as --
<xsl:variable name="dots"> )holds these <a/> tags
(which is a RTF -- result tree fragment).
I convert the RTF into a nodeset, and calculate the
count of <a/> tags, *which is the answer*.
Regards,
Mukul
--- james walker <jameswalkerandy@xxxxxxxxxxx> wrote:
> given the xml
> <vs>
> <ve pos="1"></ve>
> <ve pos="1.1"></ve>
> <ve pos="1.1.1"></ve>
> <ve pos="1.1.1.1"></ve>
> <ve pos="1.1.1.2"></ve>
> <ve pos="1.1.1.3"></ve>
> <ve pos"1.2"></ve>
> <ve pos="1.2.1"></ve>
> <<ve pos="1.2.1.1"></ve>
> <ve pos="2"></ve>
> <ve pos="2.1"></ve>
> <ve pos="2.1.1"></ve>
> <ve pos="2.1.1.1"></ve>
> </vs>
>
> and given that i am starting on a node with pos=1
> (or 2 or 3....), how do i
> count the nodes which have position with 3 dots only
> (e.g. pos=1.1.2.1?) and
> start with the current node position. I came up with
> something like this:
>
> <xsl:variable name="rowspan"
> select="count(ve[starts-with(@position,
> current()/@position) and contains(...........)])" />
> e.g. for position 1, it should be 4 (1.1.1.1 ,
> 1.1.1.2, 1.1.1.3, 1.2.1.1)
>
>
_________________________________________________________________
> Get Hotmail on your mobile phone
> http://www.msn.co.uk/msnmobile
>
>
> XSL-List info and archive:
> http://www.mulberrytech.com/xsl/xsl-list
>
__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








