code: public static boolean isLetter (char c)
      {
  	// [84] Letter ::= BaseChar | Ideographic
  	// [85] BaseChar ::= ... too much to repeat
  	// [86] Ideographic ::= ... too much to repeat
  
  	//
  	// Optimize the typical case.
  	//
  	if (c >= 'a' && c <= 'z')
  	    return true;
  	if (c == '/')
  	    return false;
  	if (c >= 'A' && c <= 'Z')
  	    return true;
  
  	//
  	// Since the tables are too ridiculous to use in code,
  	// we're using the footnotes here to drive this test.
  	//
  	switch (Character.getType (c)) {
  	    // app. B footnote says these are 'name start'
  	    // chars' ...
  	  case Character.LOWERCASE_LETTER:		// Ll
  	  case Character.UPPERCASE_LETTER:		// Lu
  	  case Character.OTHER_LETTER:			// Lo
  	  case Character.TITLECASE_LETTER:		// Lt
  	  case Character.LETTER_NUMBER:			// Nl
  
  	    // OK, here we just have some exceptions to check...
  	    return !isCompatibilityChar (c)
  		    // per "5.14 of Unicode", rule out some combiners
  		&& !(c >= 0x20dd && c <= 0x20e0);
  
  	  default:
  	    // check for some exceptions:  these are "alphabetic"
  	    return ((c >= 0x02bb && c <=  0x02c1)
  		    || c == 0x0559 || c == 0x06e5 || c == 0x06e6);
  	}
      }
docs: Returns true if the character is an XML "letter".  XML Names must
  start with Letters or a few other characters, but other characters
  in names must only satisfy the <em>isNameChar</em> predicate.
  
  @see #isNameChar