function createSloList(xmlDoc)
{
  if (KonquerorBrowserWarning(xmlDoc)) return;

  // grab all 'course' elements from MathDeptInfoAll XML file
  var x = xmlDoc.getElementsByTagName('course');

  // start an unordered list, of class 'orangeballs', in which each list item is one course in the catalog;
  // setAttribute() coding is funny because IE uses "className" instead of "class" as its Javascript name for the "class" attribute;
  // this might break in a browser that (like IE) recognizes "document.all" but (unlike IE) does not recognize "className"
  /* <ul class="orangeballs"> */
  var unorderedList = document.createElement('ul');
  unorderedList.setAttribute((document.all ? 'className' : 'class'), 'orangeballs');

  // loop over all courses in the MathDeptInfoAll database ...
  var i;
  for (i = 0;  i < x.length;  i++)
  {
    // ... but only select courses that have actual catalog entries for inclusion in the list (among the ones not cataloged are the online courses)
    if( x[i].getElementsByTagName('has_catalog_entry')[0].childNodes[0].nodeValue != 'Y' ) continue;

    // unordered-list item gives the course number and name, followed by the introductory text for the list, and then the list itself
    /* <li> */
    var ulListItem = document.createElement('li');

    /*   <strong> */
    var strong = document.createElement('strong');

    /*   <a href="http://academic.venturacollege.edu/mbowen/mathdept/MathSLO.shtml#Math_Vxx" name="Math_Vxx" id="Math_Vxx"> */
    var destAnchor = document.createElement('a');
    var destAnchorName = x[i].getElementsByTagName('unique_ID')[0].childNodes[0].nodeValue;
    destAnchor.setAttribute('href', window.location.protocol + '//' + window.location.host + window.location.pathname + '#' + destAnchorName);
    destAnchor.setAttribute('name', destAnchorName);
    destAnchor.setAttribute('id', destAnchorName);

    /*   Math Vxx */
    destAnchor.appendChild(document.createTextNode(x[i].getElementsByTagName('course_number')[0].childNodes[0].nodeValue));

    /*   </a> */
    strong.appendChild(destAnchor);

    /*   (Algebraic Differential Geometry and Trigonometry of Discrete Linear Health Care Statistics with Applied Calculus). */
    strong.appendChild(document.createTextNode(' ('));
    strong.appendChild(document.createTextNode(x[i].getElementsByTagName('course_name')[0].childNodes[0].nodeValue));
    strong.appendChild(document.createTextNode('). '));

    /*   </strong> */
    ulListItem.appendChild(strong);

    // grab the 'student_learning_outcomes' node and its child nodes for the current course
    var slo = x[i].getElementsByTagName('student_learning_outcomes');

    /*   Students will use appropriate techniques to: */
    if( slo[0].getElementsByTagName('preamble')[0].hasChildNodes() )  // if there is a SLO preamble, add it
      ulListItem.appendChild(document.createTextNode(slo[0].getElementsByTagName('preamble')[0].childNodes[0].nodeValue));

    // grab all 'outcome' elements from within the 'student_learning_outcomes/outcomes' path for the current course
    var o = slo[0].getElementsByTagName('outcomes')[0].getElementsByTagName('outcome');

    // start an ordered list for all learning outcomes for the current course
    /*   <ol> */
    var orderedList = document.createElement('ol');

    // loop over all outcomes for the current course and make a list item of each
    var j;
    for (j = 0;  j < o.length;  j++)
    {
      /*     <li>Solve elementary linear analytic word problems in two variables</li> */
      var olListItem = document.createElement('li');
      olListItem.appendChild(document.createTextNode(o[j].childNodes[0].nodeValue));
      orderedList.appendChild(olListItem);
    } // end of loop over all outcomes

    /*   </ol> */
    ulListItem.appendChild(orderedList);
 
   /* </li> */
    unorderedList.appendChild(ulListItem);
  } // end of loop over all courses in the MathDeptInfoAll database

  /* </ul> */
  document.getElementById('write_slo_here').appendChild(unorderedList);
}