private void parse()

in xalan/src/main/java/org/apache/xalan/xsltc/trax/DOM2TO.java [96:234]


    private void parse(Node node) 
	throws IOException, SAXException 
    {
 	if (node == null) return;

        switch (node.getNodeType()) {
	case Node.ATTRIBUTE_NODE:         // handled by ELEMENT_NODE
	case Node.DOCUMENT_TYPE_NODE :
	case Node.ENTITY_NODE :
	case Node.ENTITY_REFERENCE_NODE:
	case Node.NOTATION_NODE :
	    // These node types are ignored!!!
	    break;
	case Node.CDATA_SECTION_NODE:
	    _handler.startCDATA();
	    _handler.characters(node.getNodeValue());
	    _handler.endCDATA();
	    break;

	case Node.COMMENT_NODE:           // should be handled!!!
	    _handler.comment(node.getNodeValue());
	    break;

	case Node.DOCUMENT_NODE:
	    _handler.startDocument();
	    Node next = node.getFirstChild();
	    while (next != null) {
		parse(next);
		next = next.getNextSibling();
	    }
	    _handler.endDocument();
	    break;

	case Node.DOCUMENT_FRAGMENT_NODE:
	    next = node.getFirstChild();
	    while (next != null) {
		parse(next);
		next = next.getNextSibling();
	    }
	    break;

	case Node.ELEMENT_NODE:
	    // Generate SAX event to start element
	    final String qname = node.getNodeName();
	    _handler.startElement(null, null, qname);

            int colon;
	    String prefix;
	    final NamedNodeMap map = node.getAttributes();
	    final int length = map.getLength();

	    // Process all namespace attributes first
	    for (int i = 0; i < length; i++) {
		final Node attr = map.item(i);
		final String qnameAttr = attr.getNodeName();

                // Is this a namespace declaration?
		if (qnameAttr.startsWith(XMLNS_PREFIX)) {
		    final String uriAttr = attr.getNodeValue();
		    colon = qnameAttr.lastIndexOf(':');
		    prefix = (colon > 0) ? qnameAttr.substring(colon + 1) 
			                 : EMPTYSTRING;
		    _handler.namespaceAfterStartElement(prefix, uriAttr);
		}
	    }
            
	    // Process all non-namespace attributes next
            NamespaceMappings nm = new NamespaceMappings();
	    for (int i = 0; i < length; i++) {
		final Node attr = map.item(i);
		final String qnameAttr = attr.getNodeName();

                // Is this a regular attribute?
		if (!qnameAttr.startsWith(XMLNS_PREFIX)) {
		    final String uriAttr = attr.getNamespaceURI();
		    // Uri may be implicitly declared
		    if (uriAttr != null && !uriAttr.equals(EMPTYSTRING) ) {	
			colon = qnameAttr.lastIndexOf(':');
                           
                        // Fix for bug 26319
                        // For attributes not given an prefix explictly
                        // but having a namespace uri we need
                        // to explicitly generate the prefix
                        String newPrefix = nm.lookupPrefix(uriAttr);
                        if (newPrefix == null) 
                            newPrefix = nm.generateNextPrefix();
			prefix = (colon > 0) ? qnameAttr.substring(0, colon) 
			    : newPrefix;
			_handler.namespaceAfterStartElement(prefix, uriAttr);
		        _handler.addAttribute((prefix + ":" + qnameAttr),
                            attr.getNodeValue());
		    } else {
                         _handler.addAttribute(qnameAttr, attr.getNodeValue());
                    }
                }
	    }

	    // Now element namespace and children
	    final String uri = node.getNamespaceURI();
            final String localName = node.getLocalName();

	    // Uri may be implicitly declared
	    if (uri != null) {	
		colon = qname.lastIndexOf(':');
		prefix = (colon > 0) ? qname.substring(0, colon) : EMPTYSTRING;
		_handler.namespaceAfterStartElement(prefix, uri);
	    }else {
                  // Fix for bug 26319
                  // If an element foo is created using
                  // createElementNS(null,locName)
                  // then the  element should be serialized
                  // <foo xmlns=" "/> 
                  if (uri == null  && localName != null) {
 		     prefix = EMPTYSTRING;
		     _handler.namespaceAfterStartElement(prefix, EMPTYSTRING);
                 }
            }

	    // Traverse all child nodes of the element (if any)
	    next = node.getFirstChild();
	    while (next != null) {
		parse(next);
		next = next.getNextSibling();
	    }

	    // Generate SAX event to close element
	    _handler.endElement(qname);
	    break;

	case Node.PROCESSING_INSTRUCTION_NODE:
	    _handler.processingInstruction(node.getNodeName(),
					   node.getNodeValue());
	    break;

	case Node.TEXT_NODE:
	    _handler.characters(node.getNodeValue());
	    break;
	}
    }