<!DOCTYPE xsl:stylesheet [ 
  <!ENTITY LF "<xsl:text xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
</xsl:text>" > 
]>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:func="http://exslt.org/functions"
  exclude-result-prefixes="func"
>
  <xsl:output omit-xml-declaration="yes" />
 
  <xsl:template match="/mult">
    <mat>&LF;
      <xsl:copy-of select="func:prodMM(*[1]/*, *[2]/*)"/>
    </mat>&LF;
  </xsl:template>
  
  <func:function name="func:prodMM">
    <xsl:param name="A"/>
    <xsl:param name="B"/>

    <func:result>
      <xsl:if test="$A/*">
        <r><xsl:copy-of select="func:prodVM($A[1]/*, $B)"/></r>&LF;

        <xsl:copy-of select="func:prodMM($A[position()>1], $B)"/>
      </xsl:if>      
    </func:result>
  </func:function>

  <func:function name="func:prodVM">
    <xsl:param name="a"/>
    <xsl:param name="B"/>
    <xsl:param name="col" select="1"/>

    <func:result>
      <xsl:if test="$B/*[$col]">
        <c><xsl:copy-of select="func:prod($a, $B/*[$col])"/></c>

        <xsl:copy-of select="func:prodVM($a, $B, $col+1)"/>
      </xsl:if>      
    </func:result>
  </func:function>

  <func:function name="func:prod">
    <xsl:param name="a"/>
    <xsl:param name="b"/>

    <func:result>
      <xsl:if test="not($a)">0</xsl:if>

      <xsl:if test="$a">
        <xsl:value-of select="$a[1] * $b[1]+
                              func:prod($a[position()>1], $b[position()>1])"/>
      </xsl:if>      
    </func:result>
  </func:function>

</xsl:stylesheet>