prefix = attQName.substring(n+1);
prefix = attQName.substring(6);
    public void startElement (String qName, AttributeList qAtts)	throws SAXException    {				// These are exceptions from the				// first pass; they should be				// ignored if there's a second pass,				// but reported otherwise.	Vector exceptions = null;				// If we're not doing Namespace				// processing, dispatch this quickly.	if (!namespaces) {	    if (contentHandler != null) {		attAdapter.setAttributeList(qAtts);		contentHandler.startElement("", "", qName.intern(),					    attAdapter);	    }	    return;	}				// OK, we're doing Namespace processing.	nsSupport.pushContext();	int length = qAtts.getLength();					// First pass:  handle NS decls	for (int i = 0; i < length; i++) {	    String attQName = qAtts.getName(i);	    if (!attQName.startsWith("xmlns"))		continue;				// Could be a declaration...	    String prefix;	    int n = attQName.indexOf(':');	    			// xmlns=...	    if (n == -1 && attQName.length () == 5) {		prefix = "";	    } else if (n != 5) {		// XML namespaces spec doesn't discuss "xmlnsf:oo"		// (and similarly named) attributes ... at most, warn		continue;	    } else 		// xmlns:foo=...		prefix = attQName.substring(n+1);	    String value = qAtts.getValue(i);	    if (!nsSupport.declarePrefix(prefix, value)) {		reportError("Illegal Namespace prefix: " + prefix);		continue;	    }	    if (contentHandler != null)		contentHandler.startPrefixMapping(prefix, value);	}					// Second pass: copy all relevant				// attributes into the SAX2 AttributeList				// using updated prefix bindings	atts.clear();	for (int i = 0; i < length; i++) {	    String attQName = qAtts.getName(i);	    String type = qAtts.getType(i);	    String value = qAtts.getValue(i);				// Declaration?	    if (attQName.startsWith("xmlns")) {		String prefix;		int n = attQName.indexOf(':');		if (n == -1 && attQName.length () == 5) {		    prefix = "";		} else if (n != 5) {		    // XML namespaces spec doesn't discuss "xmlnsf:oo"		    // (and similarly named) attributes ... ignore		    prefix = null;		} else {		    prefix = attQName.substring(n+1);		}				// Yes, decl:  report or prune		if (prefix != null) {		    if (prefixes)			atts.addAttribute("", "", attQName.intern(),				      type, value);		    continue;		}	    } 				// Not a declaration -- report	    try {		String attName[] = processName(attQName, true, true);		atts.addAttribute(attName[0], attName[1], attName[2],				  type, value);	    } catch (SAXException e) {		if (exceptions == null)		    exceptions = new Vector();		exceptions.addElement(e);		atts.addAttribute("", attQName, attQName, type, value);	    }	}		// now handle the deferred exception reports	if (exceptions != null && errorHandler != null) {	    for (int i = 0; i < exceptions.size(); i++)		errorHandler.error((SAXParseException)				(exceptions.elementAt(i)));	}				// OK, finally report the event.	if (contentHandler != null) {	    String name[] = processName(qName, false, false);	    contentHandler.startElement(name[0], name[1], name[2], atts);	}    }