Page 7 of 11

 

Previous Page Table Of ContentsNext Page
Table of Contents

 Introduction
 Starting point
 Major FP design patterns/functions in XSLT
 List processing
 Tree processing
 Lazy evaluation
 Advanced XSLT FP applications
 Square root
 Numerical differentiation
 Numerical integration
 Summary


The Functional Programming Language XSLT - A proof through examples

Advanced XSLT FP applications

In this section we provide the XSLT implementation of some advanced numerical algorithms by using essentially higher order functions for list processing and list generation. Essentially used in these implementations is a function within , which is passed a list-generator function and a tolerance as parameters. within  uses the buildListWhile function with the list-generator passed to it as parameter and with its own controller function, which triggers the stop condition, whenever the difference between the last two generated list elements becomes less than the tolerance parameter eps.

Here's the XSLT implementation of within:

 <xsl:stylesheet version = "1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:MyWithinEpsController="MyWithinEpsController"
    exclude-result-prefixes = "xsl msxsl MyWithinEpsController"
>

         <xsl:import href = "buildListWhile.xsl" />

         <MyWithinEpsController:MyWithinEpsController/>

         <xsl:variable name = "vMyWithinEpsController" 
                      select = "document('')/*/MyWithinEpsController:*[1]"
/>

         <xsl:template name = "within" >
             <xsl:param name = "pGenerator" select = "/.." />
             <xsl:param name = "pParam0" select = "/.." />
             <xsl:param name = "Eps" select = "0.1" />

             <xsl:variable name = "vResultList" >
                 <xsl:call-template name = "buildListWhile" >
                     <xsl:with-param name = "pGenerator" 
                                    select = "$pGenerator"
/>
                     <xsl:with-param name = "pParam0" select = "$pParam0" />
                     <xsl:with-param name = "pController" 
                                    select = "$vMyWithinEpsController"
/>
                     <xsl:with-param name = "pContollerParam" select = "$Eps" />
                 </xsl:call-template>
             </xsl:variable>

             <xsl:value-of select = "msxsl:node-set($vResultList)/*[last()]" />
         </xsl:template>

         <xsl:template name = "MyWithinEpsController" 
                      match = "*[namespace-uri()='MyWithinEpsController']"
>

             <xsl:param name = "pList" select = "/.." />
             <xsl:param name = "pParams" />

             <xsl:choose>
                 <xsl:when test = "count($pList) &lt; 2" >1</xsl:when>
                 <xsl:when test = "count($pList) >= 2" >
                     <xsl:variable name = "lastDiff" 
                                  select = "$pList[last()] - $pList[last() - 1]"
/>
                     <xsl:if test = "not($lastDiff &lt;= $pParams and $lastDiff >= (0 - $pParams))" >1
                    </xsl:if>
                 </xsl:when>
                 <xsl:otherwise>1</xsl:otherwise>
             </xsl:choose>
         </xsl:template>

     </xsl:stylesheet>

Page 7 of 11

 

Previous Page Table Of ContentsNext Page

SourceForge.net Logo