14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file 44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information 54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file 64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License. 84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at 94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software 134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and 164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License. 174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: ProcessorLRE.java 475981 2006-11-16 23:35:53Z minchau $ 204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xalan.processor; 224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.util.List; 244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport javax.xml.transform.TransformerConfigurationException; 264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport javax.xml.transform.TransformerException; 274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.res.XSLMessages; 294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources; 304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.Constants; 314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.ElemExtensionCall; 324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.ElemLiteralResult; 334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.ElemTemplate; 344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.ElemTemplateElement; 354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.Stylesheet; 364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.StylesheetRoot; 374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.XMLNSDecl; 384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.utils.SAXSourceLocator; 394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.XPath; 404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.xml.sax.Attributes; 424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.xml.sax.Locator; 434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.xml.sax.helpers.AttributesImpl; 444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/** 464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Processes an XSLT literal-result-element, or something that looks 474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * like one. The actual {@link org.apache.xalan.templates.ElemTemplateElement} 484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * produced may be a {@link org.apache.xalan.templates.ElemLiteralResult}, 494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * a {@link org.apache.xalan.templates.StylesheetRoot}, or a 504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * {@link org.apache.xalan.templates.ElemExtensionCall}. 514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a> 534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @see org.apache.xalan.templates.ElemLiteralResult 544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage internal 554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic class ProcessorLRE extends ProcessorTemplateElem 574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{ 584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson static final long serialVersionUID = -1490218021772101404L; 594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Receive notification of the start of an element. 614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param handler non-null reference to current StylesheetHandler that is constructing the Templates. 634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param uri The Namespace URI, or an empty string. 644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param localName The local name (without prefix), or empty string if not namespace processing. 654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param rawName The qualified name (with prefix). 664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param attributes The specified or defaulted attributes. 674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void startElement( 694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes) 704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throws org.xml.sax.SAXException 714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try 744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ElemTemplateElement p = handler.getElemTemplateElement(); 764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson boolean excludeXSLDecl = false; 774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson boolean isLREAsStyleSheet = false; 784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null == p) 804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // Literal Result Template as stylesheet. 834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson XSLTElementProcessor lreProcessor = handler.popProcessor(); 844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson XSLTElementProcessor stylesheetProcessor = 854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson handler.getProcessorFor(Constants.S_XSLNAMESPACEURL, "stylesheet", 864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson "xsl:stylesheet"); 874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson handler.pushProcessor(lreProcessor); 894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Stylesheet stylesheet; 914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try 924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheet = getStylesheetRoot(handler); 944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson catch(TransformerConfigurationException tfe) 964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throw new TransformerException(tfe); 984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // stylesheet.setDOMBackPointer(handler.getOriginatingNode()); 1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // ***** Note that we're assigning an empty locator. Is this necessary? 1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson SAXSourceLocator slocator = new SAXSourceLocator(); 1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Locator locator = handler.getLocator(); 1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if(null != locator) 1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson slocator.setLineNumber(locator.getLineNumber()); 1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson slocator.setColumnNumber(locator.getColumnNumber()); 1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson slocator.setPublicId(locator.getPublicId()); 1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson slocator.setSystemId(locator.getSystemId()); 1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheet.setLocaterInfo(slocator); 1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheet.setPrefixes(handler.getNamespaceSupport()); 1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson handler.pushStylesheet(stylesheet); 1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson isLREAsStyleSheet = true; 1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson AttributesImpl stylesheetAttrs = new AttributesImpl(); 1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson AttributesImpl lreAttrs = new AttributesImpl(); 1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int n = attributes.getLength(); 1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = 0; i < n; i++) 1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String attrLocalName = attributes.getLocalName(i); 1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String attrUri = attributes.getURI(i); 1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String value = attributes.getValue(i); 1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if ((null != attrUri) && attrUri.equals(Constants.S_XSLNAMESPACEURL)) 1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheetAttrs.addAttribute(null, attrLocalName, attrLocalName, 1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson attributes.getType(i), 1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson attributes.getValue(i)); 1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson else if ((attrLocalName.startsWith("xmlns:") || attrLocalName.equals( 1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson "xmlns")) && value.equals(Constants.S_XSLNAMESPACEURL)) 1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // ignore 1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson else 1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson lreAttrs.addAttribute(attrUri, attrLocalName, 1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson attributes.getQName(i), 1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson attributes.getType(i), 1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson attributes.getValue(i)); 1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson attributes = lreAttrs; 1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // Set properties from the attributes, but don't throw 1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // an error if there is an attribute defined that is not 1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // allowed on a stylesheet. 1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try{ 1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheetProcessor.setPropertiesFromAttributes(handler, "stylesheet", 1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheetAttrs, stylesheet); 1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson catch (Exception e) 1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // This is pretty ugly, but it will have to do for now. 1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // This is just trying to append some text specifying that 1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // this error came from a missing or invalid XSLT namespace 1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // declaration. 1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // If someone comes up with a better solution, please feel 1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // free to contribute it. -mm 1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (stylesheet.getDeclaredPrefixes() == null || 1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson !declaredXSLNS(stylesheet)) 1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throw new org.xml.sax.SAXException(XSLMessages.createWarning(XSLTErrorResources.WG_OLD_XSLT_NS, null)); 1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson else 1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throw new org.xml.sax.SAXException(e); 1744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson handler.pushElemTemplateElement(stylesheet); 1774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ElemTemplate template = new ElemTemplate(); 1794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (slocator != null) 1804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson template.setLocaterInfo(slocator); 1814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson appendAndPush(handler, template); 1834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson XPath rootMatch = new XPath("/", stylesheet, stylesheet, XPath.MATCH, 1854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson handler.getStylesheetProcessor().getErrorListener()); 1864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson template.setMatch(rootMatch); 1884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // template.setDOMBackPointer(handler.getOriginatingNode()); 1904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheet.setTemplate(template); 1914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson p = handler.getElemTemplateElement(); 1934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson excludeXSLDecl = true; 1944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson XSLTElementDef def = getElemDef(); 1974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Class classObject = def.getClassObject(); 1984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson boolean isExtension = false; 1994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson boolean isComponentDecl = false; 2004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson boolean isUnknownTopLevel = false; 2014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson while (null != p) 2034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // System.out.println("Checking: "+p); 2064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (p instanceof ElemLiteralResult) 2074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ElemLiteralResult parentElem = (ElemLiteralResult) p; 2094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson isExtension = parentElem.containsExtensionElementURI(uri); 2114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson else if (p instanceof Stylesheet) 2134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Stylesheet parentElem = (Stylesheet) p; 2154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson isExtension = parentElem.containsExtensionElementURI(uri); 2174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if ((false == isExtension) && (null != uri) 2194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson && (uri.equals(Constants.S_BUILTIN_EXTENSIONS_URL) 2204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson || uri.equals(Constants.S_BUILTIN_OLD_EXTENSIONS_URL))) 2214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson isComponentDecl = true; 2234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson else 2254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson isUnknownTopLevel = true; 2274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (isExtension) 2314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson break; 2324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson p = p.getParentElem(); 2344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ElemTemplateElement elem = null; 2374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try 2394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (isExtension) 2414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // System.out.println("Creating extension(1): "+uri); 2444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem = new ElemExtensionCall(); 2454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson else if (isComponentDecl) 2474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem = (ElemTemplateElement) classObject.newInstance(); 2494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson else if (isUnknownTopLevel) 2514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // TBD: Investigate, not sure about this. -sb 2544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem = (ElemTemplateElement) classObject.newInstance(); 2554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson else 2574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem = (ElemTemplateElement) classObject.newInstance(); 2594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem.setDOMBackPointer(handler.getOriginatingNode()); 2624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem.setLocaterInfo(handler.getLocator()); 2634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem.setPrefixes(handler.getNamespaceSupport(), excludeXSLDecl); 2644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (elem instanceof ElemLiteralResult) 2664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((ElemLiteralResult) elem).setNamespace(uri); 2684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((ElemLiteralResult) elem).setLocalName(localName); 2694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((ElemLiteralResult) elem).setRawName(rawName); 2704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((ElemLiteralResult) elem).setIsLiteralResultAsStylesheet( 2714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson isLREAsStyleSheet); 2724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson catch (InstantiationException ie) 2754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson handler.error(XSLTErrorResources.ER_FAILED_CREATING_ELEMLITRSLT, null, ie);//"Failed creating ElemLiteralResult instance!", ie); 2774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson catch (IllegalAccessException iae) 2794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson handler.error(XSLTErrorResources.ER_FAILED_CREATING_ELEMLITRSLT, null, iae);//"Failed creating ElemLiteralResult instance!", iae); 2814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson setPropertiesFromAttributes(handler, rawName, attributes, elem); 2844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // bit of a hack here... 2864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (!isExtension && (elem instanceof ElemLiteralResult)) 2874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson isExtension = 2894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((ElemLiteralResult) elem).containsExtensionElementURI(uri); 2904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (isExtension) 2924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 2934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // System.out.println("Creating extension(2): "+uri); 2954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem = new ElemExtensionCall(); 2964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem.setLocaterInfo(handler.getLocator()); 2984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson elem.setPrefixes(handler.getNamespaceSupport()); 2994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((ElemLiteralResult) elem).setNamespace(uri); 3004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((ElemLiteralResult) elem).setLocalName(localName); 3014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((ElemLiteralResult) elem).setRawName(rawName); 3024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson setPropertiesFromAttributes(handler, rawName, attributes, elem); 3034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson appendAndPush(handler, elem); 3074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson catch(TransformerException te) 3094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 3104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throw new org.xml.sax.SAXException(te); 3114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 3154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This method could be over-ridden by a class that extends this class. 3164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param handler non-null reference to current StylesheetHandler that is constructing the Templates. 3174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return an object that represents the stylesheet element. 3184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 3194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected Stylesheet getStylesheetRoot(StylesheetHandler handler) throws TransformerConfigurationException 3204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 3214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson StylesheetRoot stylesheet; 3224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheet = new StylesheetRoot(handler.getSchema(), handler.getStylesheetProcessor().getErrorListener()); 3234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (handler.getStylesheetProcessor().isSecureProcessing()) 3244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson stylesheet.setSecureProcessing(true); 3254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return stylesheet; 3274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/** 3314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Receive notification of the end of an element. 3324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 3334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param handler non-null reference to current StylesheetHandler that is constructing the Templates. 3344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param uri The Namespace URI, or an empty string. 3354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param localName The local name (without prefix), or empty string if not namespace processing. 3364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param rawName The qualified name (with prefix). 3374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 3384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void endElement( 3394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson StylesheetHandler handler, String uri, String localName, String rawName) 3404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throws org.xml.sax.SAXException 3414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 3424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ElemTemplateElement elem = handler.getElemTemplateElement(); 3444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (elem instanceof ElemLiteralResult) 3464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 3474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (((ElemLiteralResult) elem).getIsLiteralResultAsStylesheet()) 3484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 3494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson handler.popStylesheet(); 3504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super.endElement(handler, uri, localName, rawName); 3544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson private boolean declaredXSLNS(Stylesheet stylesheet) 3574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 3584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson List declaredPrefixes = stylesheet.getDeclaredPrefixes(); 3594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int n = declaredPrefixes.size(); 3604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = 0; i < n; i++) 3624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 3634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson XMLNSDecl decl = (XMLNSDecl) declaredPrefixes.get(i); 3644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if(decl.getURI().equals(Constants.S_XSLNAMESPACEURL)) 3654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return true; 3664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return false; 3684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson} 370