|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: reccursive sum ?
Something along these lines would work
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
<xsl:output method="xml" indent="yes"
xmlns:xalan="http://xml.apache.org/xslt";
xalan:indent-amount="2"/>
<xsl:template match="/root">
<!-- the id of the folder to count -->
<xsl:variable name="dir-id" select="'dir1'"/>
<xsl:variable name="count">
<xsl:call-template name="count-files">
<xsl:with-param name="dir" select="/root/folder[@id=$dir-id]"/>
</xsl:call-template>
</xsl:variable>
There are <xsl:value-of select="$count"/> files under <xsl:value-of
select="$dir"/>.
</xsl:template>
<xsl:template name="count-files">
<xsl:param name="dir"/>
<!-- count the files in this dir -->
<xsl:variable name="counter">
<xsl:choose>
<xsl:when test="$dir/file[@id]">
<xsl:call-template name="count-subfiles">
<xsl:with-param name="file" select="$dir/file[@id][1]"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$dir/@files + $counter"/>
</xsl:template>
<xsl:template name="count-subfiles">
<xsl:param name="file"/>
<!-- count the files in the related dir -->
<xsl:variable name="x">
<xsl:call-template name="count-files">
<xsl:with-param name="dir" select="/root/folder[@id=$file/@id]"/>
</xsl:call-template>
</xsl:variable>
<!-- count the files in the following-sibling files with dir ids-->
<xsl:variable name="y">
<xsl:choose>
<xsl:when test="$file/following-sibling::file[@id]">
<xsl:call-template name="count-subfiles">
<xsl:with-param name="file"
select="$file/following-sibling::file[@id][1]"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$x + $y"/>
</xsl:template>
</xsl:stylesheet>
----- Original Message -----
From: "Ricaud Matthieu" <matthieu.ricaud@xxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Tuesday, March 02, 2004 10:39 AM
Subject: reccursive sum ?
> For each "ME" node in LIST.xml, i calculate the number of "devoirs". To do
> so I must open each MATIERE.XML and making a count of all "DEVOIR" nodes.
>
> LIST.xml looks like this :
>
> <LISTE-ME>
> <ME id="0010"/>
> <ME id="0045"/>
> <ME id="0152"/>
> </LISTE-ME>
>
> Each ME has a description in his own file, for instance the file 0010.xml
> looks like this :
>
> <ME ref="0010">
> <FOURN label="anything">
> <DEVOIR name="anything">
> <DEVOIR name="anything">
> </FOURN>
> <FOURN label="anything">
> <DEVOIR name="anything">
> <DEVOIR name="anything">
> <DEVOIR name="anything">
> </FOURN>
> </ME>
>
> The XSL apply on LIST.xml looks like this :
>
> <xsl:template match="LISTE-ME">
> <xsl:for-each select="ME">
> <xsl:variable name="ThisMEid">
> <xsl:value-of select="@id"/>
> </xsl:variable>
> ME <xsl:value-of select="@id"/> :
> <xsl:call-template name="NbreDevoirsME">
> <xsl:with-param name="MEid" select="$ThisMEid"/>
> </xsl:call-template>
> devoirs <br/>
> <xsl:for-each/>
> </xsl:template>
>
> <xsl:template name="NbreDevoirsME">
> <xsl:param name="MEid"/>
> <xsl:variable name="MEfile">
> <xsl:value-of select="$MEid">.xml
> </xsl:variable>
> <xsl:value-of select="count(document($MEfile)/ME/FOURN/DEVOIR"/>
> </xsl:template>
>
> The Output would be here something like this :
>
> ME 0010 : 5 devoirs
> ME 0045 : 3 devoirs
> ME 0152 : 7 devoirs
>
> What i'd like is the total number of devoirs for all ME. ==> TOTAL = 15
> devoirs
>
> At this point I do not manage anymore :
>
> * I m pretty sure the solution must be a reccursive template, but i did
not
> find it ...
> * I thought about a way to calculate this sum :
> if I write <xsl:value-of select="5+3+7">, it gives 15.
> So I put in a variable "string" the expression to be calculated :
>
> <xsl:variable name="String">
> <xsl:for-each select="ME">
> <xsl:variable name="ThisMEid">
> <xsl:value-of select="@id"/>
> </xsl:variable>
> <xsl:call-template name="NbreDevoirsME">
> <xsl:with-param name="MEid" select="$ThisMEid"/>
> </xsl:call-template>
> <xsl:if test="position()!=last()">
> +
> </xsl:if>
> </xsl:for-each>
> </xsl:variable>
>
> Off course, when I write <xsl:value-of select="$String"/> the processor
> don't calculate it, it just dysplay the string.
> Is there a way to tell him, $string must be interpreted as a Xpath
> expression which you must calculate ?
>
>
>
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
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








