19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License. 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License. 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: TreeWalker.java 468655 2006-10-28 07:12:06Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.utils; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.File; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Comment; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Element; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.EntityReference; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.NamedNodeMap; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.ProcessingInstruction; 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Text; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ContentHandler; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.Locator; 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ext.LexicalHandler; 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.helpers.LocatorImpl; 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class does a pre-order walk of the DOM tree, calling a ContentHandler 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * interface as it goes. 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class TreeWalker 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Local reference to a ContentHandler */ 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private ContentHandler m_contentHandler = null; 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // ARGHH!! JAXP Uses Xerces without setting the namespace processing to ON! 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // DOM2Helper m_dh = new DOM2Helper(); 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** DomHelper for this TreeWalker */ 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected DOMHelper m_dh; 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Locator object for this TreeWalker */ 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private LocatorImpl m_locator = new LocatorImpl(); 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the ContentHandler used for the tree walk. 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the ContentHandler used for the tree walk 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ContentHandler getContentHandler() 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_contentHandler; 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the ContentHandler used for the tree walk. 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the ContentHandler used for the tree walk 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setContentHandler(ContentHandler ch) 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_contentHandler = ch; 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Constructor. 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param contentHandler The implemention of the 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param systemId System identifier for the document. 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * contentHandler operation (toXMLString, digest, ...) 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public TreeWalker(ContentHandler contentHandler, DOMHelper dh, String systemId) 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler = contentHandler; 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_contentHandler.setDocumentLocator(m_locator); 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (systemId != null) 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setSystemId(systemId); 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else { 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try { 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Bug see Bugzilla 26741 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl"); 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (SecurityException se) {// user.dir not accessible from applet 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_dh = dh; 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Constructor. 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param contentHandler The implemention of the 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * contentHandler operation (toXMLString, digest, ...) 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public TreeWalker(ContentHandler contentHandler, DOMHelper dh) 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler = contentHandler; 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_contentHandler.setDocumentLocator(m_locator); 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try { 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Bug see Bugzilla 26741 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl"); 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (SecurityException se){// user.dir not accessible from applet 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_dh = dh; 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Constructor. 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param contentHandler The implemention of the 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * contentHandler operation (toXMLString, digest, ...) 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public TreeWalker(ContentHandler contentHandler) 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler = contentHandler; 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_contentHandler != null) 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_contentHandler.setDocumentLocator(m_locator); 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try { 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Bug see Bugzilla 26741 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl"); 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (SecurityException se){// user.dir not accessible from applet 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_dh = new DOM2Helper(); 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Perform a pre-order traversal non-recursive style. 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that TreeWalker assumes that the subtree is intended to represent 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * a complete (though not necessarily well-formed) document and, during a 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * traversal, startDocument and endDocument will always be issued to the 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * SAX listener. 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param pos Node in the tree where to start traversal 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void traverse(Node pos) throws org.xml.sax.SAXException 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.startDocument(); 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson traverseFragment(pos); 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.endDocument(); 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Perform a pre-order traversal non-recursive style. 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * In contrast to the traverse() method this method will not issue 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * startDocument() and endDocument() events to the SAX listener. 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param pos Node in the tree where to start traversal 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void traverseFragment(Node pos) throws org.xml.sax.SAXException 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Node top = pos; 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (null != pos) 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson startNode(pos); 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Node nextNode = pos.getFirstChild(); 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (null == nextNode) 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson endNode(pos); 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (top.equals(pos)) 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson nextNode = pos.getNextSibling(); 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == nextNode) 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pos = pos.getParentNode(); 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null == pos) || (top.equals(pos))) 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != pos) 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson endNode(pos); 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson nextNode = null; 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pos = nextNode; 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Perform a pre-order traversal non-recursive style. 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that TreeWalker assumes that the subtree is intended to represent 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * a complete (though not necessarily well-formed) document and, during a 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * traversal, startDocument and endDocument will always be issued to the 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * SAX listener. 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param pos Node in the tree where to start traversal 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param top Node in the tree where to end traversal 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void traverse(Node pos, Node top) throws org.xml.sax.SAXException 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.startDocument(); 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (null != pos) 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson startNode(pos); 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Node nextNode = pos.getFirstChild(); 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (null == nextNode) 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson endNode(pos); 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null != top) && top.equals(pos)) 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson nextNode = pos.getNextSibling(); 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == nextNode) 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pos = pos.getParentNode(); 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null == pos) || ((null != top) && top.equals(pos))) 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson nextNode = null; 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pos = nextNode; 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.endDocument(); 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Flag indicating whether following text to be processed is raw text */ 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean nextIsRaw = false; 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Optimized dispatch of characters. 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private final void dispatachChars(Node node) 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws org.xml.sax.SAXException 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(m_contentHandler instanceof org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.CharacterNodeHandler) 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ((org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.CharacterNodeHandler)m_contentHandler).characters(node); 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String data = ((Text) node).getData(); 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.characters(data.toCharArray(), 0, data.length()); 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Start processing given node 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param node Node to process 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws org.xml.sax.SAXException 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void startNode(Node node) throws org.xml.sax.SAXException 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_contentHandler instanceof NodeConsumer) 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ((NodeConsumer) m_contentHandler).setOriginatingNode(node); 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (node instanceof Locator) 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Locator loc = (Locator)node; 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setColumnNumber(loc.getColumnNumber()); 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setLineNumber(loc.getLineNumber()); 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setPublicId(loc.getPublicId()); 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setSystemId(loc.getSystemId()); 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setColumnNumber(0); 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_locator.setLineNumber(0); 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson switch (node.getNodeType()) 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.COMMENT_NODE : 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String data = ((Comment) node).getData(); 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_contentHandler instanceof LexicalHandler) 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson LexicalHandler lh = ((LexicalHandler) this.m_contentHandler); 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lh.comment(data.toCharArray(), 0, data.length()); 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.DOCUMENT_FRAGMENT_NODE : 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // ??; 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.DOCUMENT_NODE : 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.ELEMENT_NODE : 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson NamedNodeMap atts = ((Element) node).getAttributes(); 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int nAttrs = atts.getLength(); 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("TreeWalker#startNode: "+node.getNodeName()); 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < nAttrs; i++) 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Node attr = atts.item(i); 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String attrName = attr.getNodeName(); 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("TreeWalker#startNode: attr["+i+"] = "+attrName+", "+attr.getNodeValue()); 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (attrName.equals("xmlns") || attrName.startsWith("xmlns:")) 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("TreeWalker#startNode: attr["+i+"] = "+attrName+", "+attr.getNodeValue()); 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int index; 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Use "" instead of null, as Xerces likes "" for the 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // name of the default namespace. Fix attributed 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // to "Steven Murray" <smurray@ebt.com>. 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String prefix = (index = attrName.indexOf(":")) < 0 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? "" : attrName.substring(index + 1); 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.startPrefixMapping(prefix, 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson attr.getNodeValue()); 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("m_dh.getNamespaceOfNode(node): "+m_dh.getNamespaceOfNode(node)); 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("m_dh.getLocalNameOfNode(node): "+m_dh.getLocalNameOfNode(node)); 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String ns = m_dh.getNamespaceOfNode(node); 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null == ns) 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ns = ""; 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.startElement(ns, 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_dh.getLocalNameOfNode(node), 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.getNodeName(), 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson new AttList(atts, m_dh)); 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.PROCESSING_INSTRUCTION_NODE : 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ProcessingInstruction pi = (ProcessingInstruction) node; 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String name = pi.getNodeName(); 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // String data = pi.getData(); 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (name.equals("xslt-next-is-raw")) 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson nextIsRaw = true; 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.processingInstruction(pi.getNodeName(), 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pi.getData()); 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.CDATA_SECTION_NODE : 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean isLexH = (m_contentHandler instanceof LexicalHandler); 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson LexicalHandler lh = isLexH 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? ((LexicalHandler) this.m_contentHandler) : null; 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (isLexH) 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lh.startCDATA(); 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dispatachChars(node); 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (isLexH) 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lh.endCDATA(); 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.TEXT_NODE : 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //String data = ((Text) node).getData(); 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (nextIsRaw) 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson nextIsRaw = false; 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_contentHandler.processingInstruction(javax.xml.transform.Result.PI_DISABLE_OUTPUT_ESCAPING, ""); 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dispatachChars(node); 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_contentHandler.processingInstruction(javax.xml.transform.Result.PI_ENABLE_OUTPUT_ESCAPING, ""); 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dispatachChars(node); 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.ENTITY_REFERENCE_NODE : 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson EntityReference eref = (EntityReference) node; 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_contentHandler instanceof LexicalHandler) 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ((LexicalHandler) this.m_contentHandler).startEntity( 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson eref.getNodeName()); 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // warning("Can not output entity to a pure SAX ContentHandler"); 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson default : 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * End processing of given node 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param node Node we just finished processing 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws org.xml.sax.SAXException 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void endNode(Node node) throws org.xml.sax.SAXException 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson switch (node.getNodeType()) 4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.DOCUMENT_NODE : 4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.ELEMENT_NODE : 4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String ns = m_dh.getNamespaceOfNode(node); 4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null == ns) 4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ns = ""; 4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.endElement(ns, 4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_dh.getLocalNameOfNode(node), 4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.getNodeName()); 4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson NamedNodeMap atts = ((Element) node).getAttributes(); 4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int nAttrs = atts.getLength(); 4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < nAttrs; i++) 4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Node attr = atts.item(i); 4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String attrName = attr.getNodeName(); 4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (attrName.equals("xmlns") || attrName.startsWith("xmlns:")) 4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int index; 4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Use "" instead of null, as Xerces likes "" for the 4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // name of the default namespace. Fix attributed 4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // to "Steven Murray" <smurray@ebt.com>. 4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String prefix = (index = attrName.indexOf(":")) < 0 4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? "" : attrName.substring(index + 1); 4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_contentHandler.endPrefixMapping(prefix); 4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.CDATA_SECTION_NODE : 4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case Node.ENTITY_REFERENCE_NODE : 4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson EntityReference eref = (EntityReference) node; 4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_contentHandler instanceof LexicalHandler) 4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson LexicalHandler lh = ((LexicalHandler) this.m_contentHandler); 4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lh.endEntity(eref.getNodeName()); 5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson default : 5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} //TreeWalker 5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 509