Currently learning for an exam and freshing up my XSLT knowledge … ;)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--
    ! Small XSLT prog that calculates the faculty of one or more
    ! numbers by recursively calling a named template
    ! numbers are expected to be in a tree:
    ! <nums><num>1</num><num>2</num>...</nums>
   -->

  <xsl:output method="text"/>

  <xsl:template match="num">
      <xsl:text>fak(</xsl:text>
      <xsl:value-of select="."/>
      <xsl:text>) is </xsl:text>
      <xsl:call-template name="fak">
          <xsl:with-param name="number" select="."/>
      </xsl:call-template>
  </xsl:template>

  <xsl:template name="fak">
      <xsl:param name="number"/>
      <xsl:choose>
          <xsl:when test="$number = 1">
              <xsl:value-of select="$number"/>
          </xsl:when>
          <xsl:otherwise>
              <xsl:variable name="recursefak">
                  <xsl:call-template name="fak">
                      <xsl:with-param name="number" select="$number - 1"/>
                  </xsl:call-template>
              </xsl:variable>
              <xsl:value-of select="$number * $recursefak"/>
          </xsl:otherwise>
      </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

Expected XML looks like this (with DTD even! ;P):

<?xml version="1.0" ?>
<!DOCTYPE numbers [
  <!ELEMENT nums (num+)>
  <!ELEMENT num (#PCDATA)>
]>
<nums>
  <num>3</num>
  <num>12</num>
</nums>