Re: [xsl] Count a substring of an attribute in childnodes

Subject: Re: [xsl] Count a substring of an attribute in childnodes
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Wed, 9 Mar 2005 22:18:08 +1100
> In XSLT11 you have to use a recursive template to accumulate the sum by
> hand adding a new value on each iteration, you could use one of
> Dimitre's FXSL procedures for example, or just code it directly.
> 
> David
> 

Yes, this transformation:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:func-transform="f:func-transform"
exclude-result-prefixes="xsl func-transform"
>
   <xsl:import href="transform-and-sum.xsl"/>

   <!-- to be applied on testTransform-and-sum1.xml -->

   <xsl:output method="text"/>
   
   <func-transform:func-transform/>

    <xsl:template match="/">
      <xsl:call-template name="transform-and-sum">
        <xsl:with-param name="pFuncTransform" 
                        select="document('')/*/func-transform:*[1]"/>
        <xsl:with-param name="pList" select="/*/*/@colwidth"/>
      </xsl:call-template>
    </xsl:template>
    
    <xsl:template match="func-transform:*">
      <xsl:param name="arg" select="0"/>
      <xsl:value-of select="translate($arg, '*', '')"/>
    </xsl:template>

</xsl:stylesheet>

when applied on the source xml file:

<tgroup cols="3" colsep="0" rowsep="0" align="left">
  <colspec colname="1" colwidth="100*" />
  <colspec colname="2" colwidth="200*" />
  <colspec colname="3" colwidth="300*" />
</tgroup>

produces the wanted result:

600

Using FXSL for XSLT 2.0 one can write:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:f="http://fxsl.sf.net/";
xmlns:func-transform="f:func-transform"
exclude-result-prefixes="f func-transform"
>
   <xsl:import href="../f/func-transform-and-sum.xsl"/>

   <!-- to be applied on testTransform-and-sum1.xml -->

   <xsl:output method="text"/>
   
    <xsl:template match="/">
      <xsl:value-of select=
      "f:transform-and-sum(document('')/*/func-transform:*[1], 
                                           /*/*/@colwidth)"/>
    </xsl:template>
    
    <func-transform:func-transform/>
    <xsl:template match="func-transform:*" mode="f:FXSL">
      <xsl:param name="arg1"/>
      <xsl:value-of select="translate($arg1, '*', '')"/>
    </xsl:template>
</xsl:stylesheet>


Cheers,

Dimitre Novatchev

Current Thread