Here's a final note to wrap up this thread.  I've completed the conversion of XALAN to SAXON and checked in my code.   Today is a good day.
 
I tried to use LexEv but found that my particular use of <!DOCTYPE> without a public or system ID caused LexEv to throw a null pointer exception.  Instead, I wrote a custom FilterReader and FilterWriter to tranlate <!DOCTYPE>, %entities; and <![CDATA[]]> elements into processing instructions and back again, and ran my transfromation of the 100 files that needed conversion.
 
I only found two issues while doing regression testing having to do with date formatting and integer math.  I had to modify my date formatting logic to handle exceptions thrown by SAXON for situations that XALAN handled transparently, like for instance when the date value is blank, dt:format-date() returns blank and SAXON throws an exception.  I also found the math in my paging logic (goto first page, goto next page, etc) needed a rewrite because XALAN does automatic casting of strings to integers before attempting a math operation whereas SAXON throws an exception.  I used "<xsl:variable as='xs:integer'/>" for my first time to explicitly define the type of a variable.
 
After 10 years of writing XSL 1.0 logic, I now get to discover all the many new benefits of XSL 2.0.   My thanks goes to you who helped me make this conversion.
 
Following is the FilterReader and FilterWriter logic I wrote for anyone wanting the reference:
 
Usage:
   reader = new FileReader(fSrcFiles[i]);
   File tempFile = new File(txtDestDir, name );
   TransformerFactory tranFactory = TransformerFactory.newInstance();
   Source stream = new StreamSource(new DocTypeEntitiesToPIFilterReader(reader));
   Transformer aTransformer = tranFactory.newTransformer(new StreamSource(fXSL));    
   Writer writer = new PIToDocTypeEntitiesFilterWriter(new FileWriter(tempFile));
   aTransformer.transform(stream, new StreamResult(writer));
   writer.flush();
   writer.close();
   copy(tempFile,fSrcFiles[i]);
   tempFile.delete();
 
FilterReader:
public class DocTypeEntitiesToPIFilterReader extends PushbackReader
{
 private boolean bInQuotes = false;
 private boolean bInDoctype = false;
 private boolean bInEntity = false;
 private boolean bInCDATA = false;
 public DocTypeEntitiesToPIFilterReader(Reader reader)
 {
  super(reader,100);
 }
 
 public int read() throws IOException
 {
  int next;
  int ch = super.read();
  if( ch == '<' && !bInDoctype && !bInCDATA )
  {
   next = super.read();
   if( next == '!' )
   {
    next = super.read();
    if( next == '-' ) // comment
    {
     unread("!-".toCharArray());
    }
    else if( next == '[' ) // CDATA
    {
     bInCDATA = true;
     unread("?cdata ".toCharArray());
    }
    else // DOCTYPE
    {
     bInDoctype = true;
     unread(("?doctype "+((char)next)).toCharArray());
    }
   }
   else
   {
    unread(next);
   }
  }
  else if( ch == ']' && bInDoctype )
  {
   bInDoctype = false;
   ch = '?';
  }
  else if( ch == ']' && bInCDATA )
  {
   next = super.read();
   if( next == ']' )
   {
    bInCDATA = false;
    ch = '?';
   }
   else
   {
    unread(next);
   }
  }
  else if( ch == '"' )
  {
   bInQuotes = !bInQuotes;
  }
  else if( ch == '&' && !bInQuotes && !bInDoctype && !bInCDATA )
  {
   bInEntity = true;
   unread("?entity ".toCharArray());
   ch = '<';
  }
  else if( ch == ';' && bInEntity )
  {
   bInEntity = false;
   super.unread(">".toCharArray());
   ch = '?';
  }
//  System.out.print((char)ch);
  return(ch);
 }
 
 public int read(char[] cbuf, int off, int len) throws IOException
 {
  for( int x=off; x < off+len; ++x )
  {
   int ch = read();
   if( ch == -1 )
   {
    if( x > off )
    {
     return x-off;
    }
    return -1;
   }
   else
    cbuf[x] = (char) ch;
  }
  return len;
 }
}
 
FilterWriter:
public class PIToDocTypeEntitiesFilterWriter extends FilterWriter
{
 StringBuffer buffer = new StringBuffer();
 boolean bInPI = false;
 boolean bInPIEnd = false;
 boolean bInDoctype = false;
 boolean bInEntity = false;
 boolean bInCDATA = false;
 
 public PIToDocTypeEntitiesFilterWriter(Writer writer)
 {
  super(writer);
 }
 
 public void write(int c) throws IOException
 {
  if( c == '<' && !bInPI && !bInDoctype && !bInCDATA )
  {
   buffer.append((char)c);
  }
  else if( c == '?' && buffer.length() == 1 && !bInPI && !bInDoctype && !bInCDATA )
  {
   buffer.append((char)c);
   bInPI = true;
  }
  else if( c != ' ' && bInPI )
  {
   buffer.append((char)c);
  }
  else if( c == ' ' && bInPI )
  {
   if( buffer.toString().equals("<?doctype") )
   {
    super.write('<');
    super.write('!');
    bInDoctype = true;
   }
   else if( buffer.toString().equals("<?entity") )
   {
    super.write('&');
    bInEntity = true;
   }
   else if( buffer.toString().equals("<?cdata") )
   {
    super.write('<');
    super.write('!');
    super.write('[');
    bInCDATA = true;
   }
   else
   {
    for( int x=0; x < buffer.length(); ++x )
    {
     super.write(buffer.charAt(x));
    }
    super.write(c);
   }
   buffer.setLength(0);
   bInPI = false;
  }
  else if( c != '?' && c != '>' && (bInDoctype || bInEntity || bInCDATA) )
  {
   for( int x=0; x < buffer.length(); ++x )
   {
    super.write(buffer.charAt(x));
   }
   buffer.setLength(0);
   super.write(c);
  }
  else if( c == '?' && bInDoctype )
  {
   super.write(']');
   bInDoctype = false;
  }
  else if( c == '?' && bInCDATA )
  {
   buffer.append((char)c);   
  }
  else if( c == '>' && bInCDATA && buffer.length() > 0 )
  {
   super.write(']');
   super.write(']');
   super.write('>');
   bInCDATA = false;
   buffer.setLength(0);
  }
  else if( c == '?' && bInEntity )
  {
  }
  else if( c == '>' && bInEntity )
  {
   super.write(';');
   bInEntity = false;
  }
  else
  {
   if( buffer.length() > 0 )
   {
    for( int x=0; x < buffer.length(); ++x )
    {
     super.write(buffer.charAt(x));
    }
    buffer.setLength(0);
    bInPI = false;
   }
   super.write(c);
  }
 }
 
 public void write(char cbuf[], int off,  int len) throws IOException 
 {
    if ( len <= 0 )
       super.write( cbuf, off, len);
    else
    {
     for( int x=off; x < off+len; ++x )
     {
      write(cbuf[x]);
     }
    }
 }
 public void write(String str, int off,  int len) throws IOException 
 {
    write( str.toCharArray(), off, len);
 }
}