template with parameters
File: Data.xml <?xml version="1.0" encoding="iso-8859-1"?> <booklist> <book> <title>title 1</title> <author>author 1</author> <publisher>publisher 1</publisher> <isbn>1-11-11111-1</isbn> <price>6.99</price> <sales>235</sales> </book> <book> <title>title 2</title> <author>author 2</author> <publisher>publisher 2</publisher> <isbn>0 14 018967 X</isbn> <price>12.99</price> <sales>12</sales> </book> </booklist> File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:template name="get-min-and-max"> <xsl:param name="nodes" as="node()*" /> <xsl:param name="min-so-far" select="number('INF')" as="xs:double" /> <xsl:param name="max-so-far" select="number('-INF')" as="xs:double" /> <xsl:choose> <xsl:when test="$nodes"> <xsl:call-template name="get-min-and-max"> <xsl:with-param name="nodes" select="remove($nodes, 1)" /> <xsl:with-param name="min-so-far" select="if (number($nodes[1]) lt $min-so-far) then $nodes[1] else $min-so-far" /> <xsl:with-param name="max-so-far" select="if (number($nodes[1]) gt $max-so-far) then $nodes[1] else $max-so-far" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:document> <min> <xsl:value-of select="$min-so-far" /> </min> <max> <xsl:value-of select="$max-so-far" /> </max> </xsl:document> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="/"> <result> <xsl:call-template name="get-min-and-max"> <xsl:with-param name="nodes" select="/booklist/book/price" /> </xsl:call-template> </result> </xsl:template> </xsl:stylesheet> Output: <?xml version="1.0" encoding="UTF-8"?><result><min>6.99</min><max>12.99</max></result>