void startElement(String elname) throws SAXException {
        ContentHandler handler = contentHandler;

        //
        // NOTE: this implementation of namespace support adds something
        // like six percent to parsing CPU time, in a large (~50 MB)
        // document that doesn't use namespaces at all. (Measured by PC
        // sampling, with a bug where endElement processing was omitted.)
        // [Measurement referred to older implementation, older JVM ...]
        //
        // It ought to become notably faster in such cases. Most
        // costs are the prefix stack calling Hashtable.get() (2%),
        // String.hashCode() (1.5%) and about 1.3% each for pushing
        // the context, and two chunks of name processing.
        //

        if (!attributes) {
            if (namespaces) {
                prefixStack.pushContext();
            }
        } else if (namespaces) {

            // now we can patch up namespace refs; we saw all the
            // declarations, so now we'll do the Right Thing
            Iterator<Attribute> itt = attributesList.iterator();
            while (itt.hasNext()) {
                Attribute attribute = itt.next();
                String qname = attribute.name;
                int index;

                // default NS declaration?
                if (stringInterning) {
                    if ("xmlns" == qname) {
                        continue;
                    }
                } else {
                    if ("xmlns".equals(qname)) {
                        continue;
                    }
                }
                // Illegal in the new Namespaces Draft
                // should it be only in 1.1 docs??
                if (qname.equals(":")) {
                    fatal("namespace names consisting of a single colon "
                            + "character are invalid");
                }
                index = qname.indexOf(':');

                // NS prefix declaration?
                if (index == 5 && qname.startsWith("xmlns")) {
                    continue;
                }

                // it's not a NS decl; patch namespace info items
                if (prefixStack.processName(qname, nsTemp, true) == null) {
                    fatal("undeclared attribute prefix in: " + qname);
                } else {
                    attribute.nameSpace = nsTemp[0];
                    attribute.localName = nsTemp[1];
                }
            }
        }

        // save element name so attribute callbacks work
        elementName = elname;
        if (namespaces) {
            if (prefixStack.processName(elname, nsTemp, false) == null) {
                fatal("undeclared element prefix in: " + elname);
                nsTemp[0] = nsTemp[1] = "";
            }
            handler.startElement(nsTemp[0], nsTemp[1], elname, this);
        } else {
            handler.startElement("", "", elname, this);
        }
        // elementName = null;

        // elements with no attributes are pretty common!
        if (attributes) {
            attributesList.clear();
            attributeCount = 0;
            attributes = false;
        }
    }
<b>SAX2</b>: Assigns the specified property. Like SAX1 handlers, these
may be changed at any time.
src/nu/validator/gnu/xml/aelfred2/SAXDriver.java