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: StylesheetRoot.java 476466 2006-11-18 08:22:31Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.templates; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.text.DecimalFormatSymbols; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.ArrayList; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.HashMap; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Hashtable; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Properties; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.ErrorListener; 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Templates; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Transformer; 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerConfigurationException; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException; 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.extensions.ExtensionNamespacesManager; 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.processor.XSLTSchema; 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages; 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources; 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TransformerImpl; 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM; 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.ref.ExpandedNameTable; 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.IntStack; 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.QName; 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPath; 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext; 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class represents the root object of the stylesheet tree. 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage general 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class StylesheetRoot extends StylesheetComposed 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson implements java.io.Serializable, Templates 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final long serialVersionUID = 3875353123529147855L; 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The flag for the setting of the optimize feature; 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private boolean m_optimizer = true; 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The flag for the setting of the incremental feature; 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private boolean m_incremental = false; 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The flag for the setting of the source_location feature; 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private boolean m_source_location = false; 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * State of the secure processing feature. 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private boolean m_isSecureProcessing = false; 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Uses an XSL stylesheet document. 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerConfigurationException if the baseIdentifier can not be resolved to a URL. 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StylesheetRoot(ErrorListener errorListener) throws TransformerConfigurationException 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(null); 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setStylesheetRoot(this); 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_selectDefault = new XPath("node()", this, this, XPath.SELECT, errorListener); 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson initDefaultRule(errorListener); 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (TransformerException se) 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new TransformerConfigurationException(XSLMessages.createMessage(XSLTErrorResources.ER_CANNOT_INIT_DEFAULT_TEMPLATES, null), se); //"Can't init default templates!", se); 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The schema used when creating this StylesheetRoot 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private HashMap m_availElems; 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Creates a StylesheetRoot and retains a pointer to the schema used to create this 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * StylesheetRoot. The schema may be needed later for an element-available() function call. 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param schema The schema used to create this stylesheet 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerConfigurationException if the baseIdentifier can not be resolved to a URL. 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StylesheetRoot(XSLTSchema schema, ErrorListener listener) throws TransformerConfigurationException 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this(listener); 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_availElems = schema.getElemsAvailable(); 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this is the root of the stylesheet tree. 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return True since this is the root of the stylesheet tree. 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean isRoot() 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the state of the secure processing feature. 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setSecureProcessing(boolean flag) 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_isSecureProcessing = flag; 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the state of the secure processing feature. 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean isSecureProcessing() 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_isSecureProcessing; 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the hashtable of available elements. 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return table of available elements, keyed by qualified names, and with 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * values of the same qualified names. 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public HashMap getAvailableElements() 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_availElems; 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private transient ExtensionNamespacesManager m_extNsMgr = null; 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Only instantiate an ExtensionNamespacesManager if one is called for 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (i.e., if the stylesheet contains extension functions and/or elements). 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ExtensionNamespacesManager getExtensionNamespacesManager() 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_extNsMgr == null) 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_extNsMgr = new ExtensionNamespacesManager(); 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_extNsMgr; 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the vector of extension namespaces. Used to provide 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the extensions table access to a list of extension 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * namespaces encountered during composition of a stylesheet. 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Vector getExtensions() 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_extNsMgr != null ? m_extNsMgr.getExtensions() : null; 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void runtimeInit(TransformerImpl transformer) throws TransformerException 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("StylesheetRoot.runtimeInit()"); 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // try{throw new Exception("StylesheetRoot.runtimeInit()");} catch(Exception e){e.printStackTrace();} 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson*/ 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //============== Templates Interface ================ 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Create a new transformation context for this Templates object. 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A Transformer instance, never null. 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Transformer newTransformer() 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return new TransformerImpl(this); 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Properties getDefaultOutputProps() 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_outputProperties.getProperties(); 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the static properties for xsl:output. The object returned will 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * be a clone of the internal values, and thus it can be mutated 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * without mutating the Templates object, and then handed in to 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the process method. 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>For XSLT, Attribute Value Templates attribute values will 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * be returned unexpanded (since there is no context at this point).</p> 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A Properties object, not null. 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Properties getOutputProperties() 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (Properties)getDefaultOutputProps().clone(); 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //============== End Templates Interface ================ 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the values of all "composed" properties, meaning 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * properties that need to be combined or calculated from 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the combination of imported and included stylesheets. This 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * method determines the proper import precedence of all imported 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * stylesheets. It then iterates through all of the elements and 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * properties in the proper order and triggers the individual recompose 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * methods. 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void recompose() throws TransformerException 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Now we make a Vector that is going to hold all of the recomposable elements 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Vector recomposableElements = new Vector(); 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // First, we build the global import tree. 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_globalImportList) 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Vector importList = new Vector(); 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson addImports(this, true, importList); 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Now we create an array and reverse the order of the importList vector. 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We built the importList vector backwards so that we could use addElement 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // to append to the end of the vector instead of constantly pushing new 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // stylesheets onto the front of the vector and having to shift the rest 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // of the vector each time. 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_globalImportList = new StylesheetComposed[importList.size()]; 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0, j= importList.size() -1; i < importList.size(); i++) 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_globalImportList[j] = (StylesheetComposed) importList.elementAt(i); 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Build the global include list for this stylesheet. 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // This needs to be done ahead of the recomposeImports 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // because we need the info from the composed includes. 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_globalImportList[j].recomposeIncludes(m_globalImportList[j]); 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Calculate the number of this import. 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_globalImportList[j--].recomposeImports(); 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Next, we walk the import tree and add all of the recomposable elements to the vector. 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = getGlobalImportCount(); 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StylesheetComposed imported = getGlobalImport(i); 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson imported.recompose(recomposableElements); 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We sort the elements into ascending order. 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson QuickSort2(recomposableElements, 0, recomposableElements.size() - 1); 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We set up the global variables that will hold the recomposed information. 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_outputProperties = new OutputProperties(org.apache.xml.serializer.Method.UNKNOWN); 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// m_outputProperties = new OutputProperties(Method.XML); 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_attrSets = new HashMap(); 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_decimalFormatSymbols = new Hashtable(); 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_keyDecls = new Vector(); 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_namespaceAliasComposed = new Hashtable(); 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_templateList = new TemplateList(); 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_variables = new Vector(); 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Now we sequence through the sorted elements, 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // calling the recompose() function on each one. This will call back into the 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // appropriate routine here to actually do the recomposition. 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note that we're going backwards, encountering the highest precedence items first. 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = recomposableElements.size() - 1; i >= 0; i--) 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ((ElemTemplateElement) recomposableElements.elementAt(i)).recompose(this); 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Backing out REE again, as it seems to cause some new failures 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * which need to be investigated. -is 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // This has to be done before the initialization of the compose state, because 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // eleminateRedundentGlobals will add variables to the m_variables vector, which 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // it then copied in the ComposeState constructor. 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// if(true && org.apache.xalan.processor.TransformerFactoryImpl.m_optimize) 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// { 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// RedundentExprEliminator ree = new RedundentExprEliminator(); 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// callVisitors(ree); 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// ree.eleminateRedundentGlobals(this); 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// } 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson initComposeState(); 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Need final composition of TemplateList. This adds the wild cards onto the chains. 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_templateList.compose(this); 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Need to clear check for properties at the same import level. 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_outputProperties.compose(this); 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_outputProperties.endCompose(this); 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Now call the compose() method on every element to give it a chance to adjust 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // based on composed values. 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson n = getGlobalImportCount(); 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StylesheetComposed imported = this.getGlobalImport(i); 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int includedCount = imported.getIncludeCountComposed(); 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int j = -1; j < includedCount; j++) 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Stylesheet included = imported.getIncludeComposed(j); 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson composeTemplates(included); 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Attempt to register any remaining unregistered extension namespaces. 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_extNsMgr != null) 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_extNsMgr.registerUnregisteredNamespaces(); 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson clearComposeState(); 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Call the compose function for each ElemTemplateElement. 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param templ non-null reference to template element that will have 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the composed method called on it, and will have it's children's composed 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * methods called. 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void composeTemplates(ElemTemplateElement templ) throws TransformerException 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson templ.compose(this); 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (ElemTemplateElement child = templ.getFirstChildElem(); 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson child != null; child = child.getNextSiblingElem()) 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson composeTemplates(child); 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson templ.endCompose(this); 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The combined list of imports. The stylesheet with the highest 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * import precedence will be at element 0. The one with the lowest 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * import precedence will be at element length - 1. 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private StylesheetComposed[] m_globalImportList; 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Add the imports in the given sheet to the working importList vector. 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The will be added from highest import precedence to 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * least import precedence. This is a post-order traversal of the 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * import tree as described in <a href="http://www.w3.org/TR/xslt.html#import">the 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * XSLT Recommendation</a>. 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>For example, suppose</p> 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>stylesheet A imports stylesheets B and C in that order;</p> 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>stylesheet B imports stylesheet D;</p> 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>stylesheet C imports stylesheet E.</p> 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Then the order of import precedence (highest first) is 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * A, C, E, B, D.</p> 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param stylesheet Stylesheet to examine for imports. 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param addToList <code>true</code> if this template should be added to the import list 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param importList The working import list. Templates are added here in the reverse 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * order of priority. When we're all done, we'll reverse this to the correct 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * priority in an array. 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void addImports(Stylesheet stylesheet, boolean addToList, Vector importList) 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Get the direct imports of this sheet. 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = stylesheet.getImportCount(); 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (n > 0) 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Stylesheet imported = stylesheet.getImport(i); 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson addImports(imported, true, importList); 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson n = stylesheet.getIncludeCount(); 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (n > 0) 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Stylesheet included = stylesheet.getInclude(i); 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson addImports(included, false, importList); 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (addToList) 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson importList.addElement(stylesheet); 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get a stylesheet from the global import list. 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TODO: JKESS PROPOSES SPECIAL-CASE FOR NO IMPORT LIST, TO MATCH COUNT. 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param i Index of stylesheet to get from global import list 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The stylesheet at the given index 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StylesheetComposed getGlobalImport(int i) 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_globalImportList[i]; 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the total number of imports in the global import list. 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The total number of imported stylesheets, including 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the root stylesheet, thus the number will always be 1 or 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * greater. 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TODO: JKESS PROPOSES SPECIAL-CASE FOR NO IMPORT LIST, TO MATCH DESCRIPTION. 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getGlobalImportCount() 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (m_globalImportList!=null) 4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? m_globalImportList.length 4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson : 1; 4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given a stylesheet, return the number of the stylesheet 4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in the global import list. 4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param sheet The stylesheet which will be located in the 4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * global import list. 4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The index into the global import list of the given stylesheet, 4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or -1 if it is not found (which should never happen). 4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getImportNumber(StylesheetComposed sheet) 4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (this == sheet) 4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return 0; 4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = getGlobalImportCount(); 4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (sheet == getGlobalImport(i)) 4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return i; 4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return -1; 4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This will be set up with the default values, and then the values 4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * will be set as stylesheets are encountered. 4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private OutputProperties m_outputProperties; 4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the output format object from the included elements. 4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param oprops non-null reference to xsl:output properties representation. 4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void recomposeOutput(OutputProperties oprops) 4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_outputProperties.copyFrom(oprops); 5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the combined "xsl:output" property with the properties 5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * combined from the included stylesheets. If a xsl:output 5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is not declared in this stylesheet or an included stylesheet, 5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * look in the imports. 5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Please note that this returns a reference to the OutputProperties 5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * object, not a cloned object, like getOutputProperties does. 5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#output">output in XSLT Specification</a> 5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return non-null reference to composed output properties object. 5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public OutputProperties getOutputComposed() 5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getOutputComposed.getIndent: "+m_outputProperties.getIndent()); 5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getOutputComposed.getIndenting: "+m_outputProperties.getIndenting()); 5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_outputProperties; 5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Flag indicating whether an output method has been set by the user. 5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial */ 5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private boolean m_outputMethodSet = false; 5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Find out if an output method has been set by the user. 5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Value indicating whether an output method has been set by the user 5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal 5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean isOutputMethodSet() 5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_outputMethodSet; 5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Composed set of all included and imported attribute set properties. 5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Each entry is a vector of ElemAttributeSet objects. 5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private HashMap m_attrSets; 5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the attribute-set declarations. 5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param attrSet An attribute-set to add to the hashtable of attribute sets. 5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void recomposeAttributeSets(ElemAttributeSet attrSet) 5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ArrayList attrSetList = (ArrayList) m_attrSets.get(attrSet.getName()); 5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == attrSetList) 5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson attrSetList = new ArrayList(); 5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_attrSets.put(attrSet.getName(), attrSetList); 5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson attrSetList.add(attrSet); 5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get a list "xsl:attribute-set" properties that match the qname. 5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#attribute-sets">attribute-sets in XSLT Specification</a> 5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param name Qualified name of attribute set properties to get 5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A vector of attribute sets matching the given name 5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws ArrayIndexOutOfBoundsException 5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ArrayList getAttributeSetComposed(QName name) 5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws ArrayIndexOutOfBoundsException 5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (ArrayList) m_attrSets.get(name); 5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Table of DecimalFormatSymbols, keyed by QName. 5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private Hashtable m_decimalFormatSymbols; 5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the decimal-format declarations. 5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param dfp A DecimalFormatProperties to add to the hashtable of decimal formats. 5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void recomposeDecimalFormats(DecimalFormatProperties dfp) 5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DecimalFormatSymbols oldDfs = 5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (DecimalFormatSymbols) m_decimalFormatSymbols.get(dfp.getName()); 5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == oldDfs) 5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_decimalFormatSymbols.put(dfp.getName(), dfp.getDecimalFormatSymbols()); 5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (!dfp.getDecimalFormatSymbols().equals(oldDfs)) 6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String themsg; 6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (dfp.getName().equals(new QName(""))) 6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // "Only one default xsl:decimal-format declaration is allowed." 6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson themsg = XSLMessages.createWarning( 6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XSLTErrorResources.WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED, 6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson new Object[0]); 6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // "xsl:decimal-format names must be unique. Name {0} has been duplicated." 6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson themsg = XSLMessages.createWarning( 6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XSLTErrorResources.WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE, 6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson new Object[] {dfp.getName()}); 6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson error(themsg); // Should we throw TransformerException instead? 6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given a valid element decimal-format name, return the 6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * decimalFormatSymbols with that name. 6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>It is an error to declare either the default decimal-format or 6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * a decimal-format with a given name more than once (even with 6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * different import precedence), unless it is declared every 6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * time with the same value for all attributes (taking into 6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * account any default values).</p> 6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>Which means, as far as I can tell, the decimal-format 6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * properties are not additive.</p> 6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param name Qualified name of the decimal format to find 6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return DecimalFormatSymbols object matching the given name or 6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * null if name is not found. 6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public DecimalFormatSymbols getDecimalFormatComposed(QName name) 6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (DecimalFormatSymbols) m_decimalFormatSymbols.get(name); 6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * A list of all key declarations visible from this stylesheet and all 6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * lesser stylesheets. 6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private Vector m_keyDecls; 6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the key declarations. 6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param keyDecl A KeyDeclaration to be added to the vector of key declarations. 6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void recomposeKeys(KeyDeclaration keyDecl) 6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_keyDecls.addElement(keyDecl); 6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the composed "xsl:key" properties. 6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#key">key in XSLT Specification</a> 6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A vector of the composed "xsl:key" properties. 6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Vector getKeysComposed() 6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_keyDecls; 6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Composed set of all namespace aliases. 6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private Hashtable m_namespaceAliasComposed; 6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the namespace-alias declarations. 6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param nsAlias A NamespaceAlias object to add to the hashtable of namespace aliases. 6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void recomposeNamespaceAliases(NamespaceAlias nsAlias) 6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_namespaceAliasComposed.put(nsAlias.getStylesheetNamespace(), 6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson nsAlias); 6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the "xsl:namespace-alias" property. 6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the NamespaceAlias for a given namespace uri. 6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a> 6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param uri non-null reference to namespace that is to be aliased. 6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return NamespaceAlias that matches uri, or null if no match. 6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public NamespaceAlias getNamespaceAliasComposed(String uri) 6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (NamespaceAlias) ((null == m_namespaceAliasComposed) 7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? null : m_namespaceAliasComposed.get(uri)); 7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The "xsl:template" properties. 7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private TemplateList m_templateList; 7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the template declarations. 7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param template An ElemTemplate object to add to the template list. 7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void recomposeTemplates(ElemTemplate template) 7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_templateList.setTemplate(template); 7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Accessor method to retrieve the <code>TemplateList</code> associated with 7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this StylesheetRoot. 7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The composed <code>TemplateList</code>. 7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public final TemplateList getTemplateListComposed() 7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_templateList; 7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Mutator method to set the <code>TemplateList</code> associated with this 7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * StylesheetRoot. This method should only be used by the compiler. Normally, 7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the template list is built during the recompose process and should not be 7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * altered by the user. 7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param templateList The new <code>TemplateList</code> for this StylesheetRoot. 7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public final void setTemplateListComposed(TemplateList templateList) 7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_templateList = templateList; 7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get an "xsl:template" property by node match. This looks in the imports as 7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * well as this stylesheet. 7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a> 7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt non-null reference to XPath runtime execution context. 7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param targetNode non-null reference of node that the template must match. 7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param mode qualified name of the node, or null. 7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param quietConflictWarnings true if conflict warnings should not be reported. 7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return reference to ElemTemplate that is the best match for targetNode, or 7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * null if no match could be made. 7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplate getTemplateComposed(XPathContext xctxt, 7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int targetNode, 7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson QName mode, 7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean quietConflictWarnings, 7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM dtm) 7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_templateList.getTemplate(xctxt, targetNode, mode, 7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson quietConflictWarnings, 7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dtm); 7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get an "xsl:template" property by node match. This looks in the imports as 7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * well as this stylesheet. 7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a> 7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt non-null reference to XPath runtime execution context. 7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param targetNode non-null reference of node that the template must match. 7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param mode qualified name of the node, or null. 7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param maxImportLevel The maximum importCountComposed that we should consider or -1 7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * if we should consider all import levels. This is used by apply-imports to 7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * access templates that have been overridden. 7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param endImportLevel The count of composed imports 7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param quietConflictWarnings true if conflict warnings should not be reported. 7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return reference to ElemTemplate that is the best match for targetNode, or 7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * null if no match could be made. 7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplate getTemplateComposed(XPathContext xctxt, 7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int targetNode, 7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson QName mode, 7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int maxImportLevel, int endImportLevel, 7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean quietConflictWarnings, 7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM dtm) 7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_templateList.getTemplate(xctxt, targetNode, mode, 7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson maxImportLevel, endImportLevel, 7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson quietConflictWarnings, 7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dtm); 8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get an "xsl:template" property. This looks in the imports as 8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * well as this stylesheet. 8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a> 8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param qname non-null reference to qualified name of template. 8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return reference to named template, or null if not found. 8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplate getTemplateComposed(QName qname) 8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_templateList.getTemplate(qname); 8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Composed set of all variables and params. 8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private Vector m_variables; 8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the top level variable and parameter declarations. 8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param elemVar A top level variable or parameter to be added to the Vector. 8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void recomposeVariables(ElemVariable elemVar) 8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Don't overide higher priority variable 8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (getVariableOrParamComposed(elemVar.getName()) == null) 8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson elemVar.setIsTopLevel(true); // Mark as a top-level variable or param 8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson elemVar.setIndex(m_variables.size()); 8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_variables.addElement(elemVar); 8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get an "xsl:variable" property. 8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a> 8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param qname Qualified name of variable or param 8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The ElemVariable with the given qualified name 8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemVariable getVariableOrParamComposed(QName qname) 8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_variables) 8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_variables.size(); 8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemVariable var = (ElemVariable)m_variables.elementAt(i); 8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(var.getName().equals(qname)) 8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return var; 8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get all global "xsl:variable" properties in scope for this stylesheet. 8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a> 8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Vector of all variables and params in scope 8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Vector getVariablesAndParamsComposed() 8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_variables; 8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * A list of properties that specify how to do space 8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * stripping. This uses the same exact mechanism as Templates. 8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private TemplateList m_whiteSpaceInfoList; 8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Recompose the strip-space and preserve-space declarations. 8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param wsi A WhiteSpaceInfo element to add to the list of WhiteSpaceInfo elements. 8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void recomposeWhiteSpaceInfo(WhiteSpaceInfo wsi) 8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_whiteSpaceInfoList) 8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_whiteSpaceInfoList = new TemplateList(); 8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_whiteSpaceInfoList.setTemplate(wsi); 8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Check to see if the caller should bother with check for 8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * whitespace nodes. 8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Whether the caller should bother with check for 8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * whitespace nodes. 9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean shouldCheckWhitespace() 9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null != m_whiteSpaceInfoList; 9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get information about whether or not an element should strip whitespace. 9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a> 9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param support The XPath runtime state. 9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param targetElement Element to check 9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return WhiteSpaceInfo for the given element 9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public WhiteSpaceInfo getWhiteSpaceInfo( 9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPathContext support, int targetElement, DTM dtm) throws TransformerException 9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_whiteSpaceInfoList) 9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (WhiteSpaceInfo) m_whiteSpaceInfoList.getTemplate(support, 9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson targetElement, null, false, dtm); 9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get information about whether or not an element should strip whitespace. 9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a> 9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param support The XPath runtime state. 9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param targetElement Element to check 9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the whitespace should be stripped. 9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean shouldStripWhiteSpace( 9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPathContext support, int targetElement) throws TransformerException 9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_whiteSpaceInfoList) 9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while(DTM.NULL != targetElement) 9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM dtm = support.getDTM(targetElement); 9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson WhiteSpaceInfo info = (WhiteSpaceInfo) m_whiteSpaceInfoList.getTemplate(support, 9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson targetElement, null, false, dtm); 9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != info) 9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return info.getShouldStripSpace(); 9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int parent = dtm.getParent(targetElement); 9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(DTM.NULL != parent && DTM.ELEMENT_NODE == dtm.getNodeType(parent)) 9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson targetElement = parent; 9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson targetElement = DTM.NULL; 9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get information about whether or not whitespace can be stripped. 9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a> 9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the whitespace can be stripped. 9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean canStripWhiteSpace() 9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null != m_whiteSpaceInfoList); 9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The default template to use for text nodes if we don't find 9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * anything else. This is initialized in initDefaultRule(). 9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private ElemTemplate m_defaultTextRule; 9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the default template for text. 9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the default template for text. 9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public final ElemTemplate getDefaultTextRule() 9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_defaultTextRule; 9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The default template to use if we don't find anything 9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * else. This is initialized in initDefaultRule(). 9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private ElemTemplate m_defaultRule; 10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the default template for elements. 10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the default template for elements. 10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public final ElemTemplate getDefaultRule() 10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_defaultRule; 10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The default template to use for the root if we don't find 10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * anything else. This is initialized in initDefaultRule(). 10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * We kind of need this because the defaultRule isn't good 10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * enough because it doesn't supply a document context. 10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * For now, I default the root document element to "HTML". 10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Don't know if this is really a good idea or not. 10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * I suspect it is not. 10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private ElemTemplate m_defaultRootRule; 10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the default template for a root node. 10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The default template for a root node. 10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public final ElemTemplate getDefaultRootRule() 10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_defaultRootRule; 10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The start rule to kick off the transformation. 10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private ElemTemplate m_startRule; 10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the default template for a root node. 10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The default template for a root node. 10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public final ElemTemplate getStartRule() 10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_startRule; 10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Used for default selection. 10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPath m_selectDefault; 10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Create the default rule if needed. 10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private void initDefaultRule(ErrorListener errorListener) throws TransformerException 10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Then manufacture a default 10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultRule = new ElemTemplate(); 10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultRule.setStylesheet(this); 10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPath defMatch = new XPath("*", this, this, XPath.MATCH, errorListener); 10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultRule.setMatch(defMatch); 10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemApplyTemplates childrenElement = new ElemApplyTemplates(); 10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson childrenElement.setIsDefaultTemplate(true); 10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson childrenElement.setSelect(m_selectDefault); 10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultRule.appendChild(childrenElement); 10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_startRule = m_defaultRule; 10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // ----------------------------- 10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultTextRule = new ElemTemplate(); 10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultTextRule.setStylesheet(this); 10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson defMatch = new XPath("text() | @*", this, this, XPath.MATCH, errorListener); 10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultTextRule.setMatch(defMatch); 10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemValueOf elemValueOf = new ElemValueOf(); 10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultTextRule.appendChild(elemValueOf); 10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPath selectPattern = new XPath(".", this, this, XPath.SELECT, errorListener); 11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson elemValueOf.setSelect(selectPattern); 11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //-------------------------------- 11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultRootRule = new ElemTemplate(); 11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultRootRule.setStylesheet(this); 11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson defMatch = new XPath("/", this, this, XPath.MATCH, errorListener); 11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultRootRule.setMatch(defMatch); 11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson childrenElement = new ElemApplyTemplates(); 11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson childrenElement.setIsDefaultTemplate(true); 11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultRootRule.appendChild(childrenElement); 11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson childrenElement.setSelect(m_selectDefault); 11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This is a generic version of C.A.R Hoare's Quick Sort 11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * algorithm. This will handle arrays that are already 11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * sorted, and arrays with duplicate keys. It was lifted from 11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the NodeSorter class but should probably be eliminated and replaced 11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * with a call to Collections.sort when we migrate to Java2.<BR> 11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * If you think of a one dimensional array as going from 11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the lowest index on the left to the highest index on the right 11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * then the parameters to this function are lowest index or 11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * left and highest index or right. The first time you call 11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this function it will be with the parameters 0, a.length - 1. 11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param v a vector of ElemTemplateElement elements 11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param lo0 left boundary of partition 11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param hi0 right boundary of partition 11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private void QuickSort2(Vector v, int lo0, int hi0) 11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int lo = lo0; 11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int hi = hi0; 11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ( hi0 > lo0) 11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Arbitrarily establishing partition element as the midpoint of 11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the array. 11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement midNode = (ElemTemplateElement) v.elementAt( ( lo0 + hi0 ) / 2 ); 11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // loop through the array until indices cross 11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while( lo <= hi ) 11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // find the first element that is greater than or equal to 11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the partition element starting from the left Index. 11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while( (lo < hi0) && (((ElemTemplateElement) v.elementAt(lo)).compareTo(midNode) < 0) ) 11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ++lo; 11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } // end while 11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // find an element that is smaller than or equal to 11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the partition element starting from the right Index. 11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while( (hi > lo0) && (((ElemTemplateElement) v.elementAt(hi)).compareTo(midNode) > 0) ) { 11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson --hi; 11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // if the indexes have not crossed, swap 11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if( lo <= hi ) 11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement node = (ElemTemplateElement) v.elementAt(lo); 11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson v.setElementAt(v.elementAt(hi), lo); 11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson v.setElementAt(node, hi); 11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ++lo; 11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson --hi; 11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If the right index has not reached the left side of array 11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // must now sort the left partition. 11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if( lo0 < hi ) 11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson QuickSort2( v, lo0, hi ); 11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If the left index has not reached the right side of array 11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // must now sort the right partition. 11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if( lo < hi0 ) 11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson QuickSort2( v, lo, hi0 ); 11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } // end QuickSort2 */ 11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private transient ComposeState m_composeState; 11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Initialize a new ComposeState. 11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void initComposeState() 12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_composeState = new ComposeState(); 12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return class to track state global state during the compose() operation. 12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return ComposeState reference, or null if endCompose has been called. 12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ComposeState getComposeState() 12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_composeState; 12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Clear the compose state. 12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private void clearComposeState() 12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_composeState = null; 12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private String m_extensionHandlerClass = 12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "org.apache.xalan.extensions.ExtensionHandlerExsltFunction"; 12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This internal method allows the setting of the java class 12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to handle the extension function (if other than the default one). 12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal 12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String setExtensionHandlerClass(String handlerClassName) { 12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String oldvalue = m_extensionHandlerClass; 12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_extensionHandlerClass = handlerClassName; 12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return oldvalue; 12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal 12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getExtensionHandlerClass() { 12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_extensionHandlerClass; 12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Class to track state global state during the compose() operation. 12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson class ComposeState 12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ComposeState() 12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int size = m_variables.size(); 12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < size; i++) 12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemVariable ev = (ElemVariable)m_variables.elementAt(i); 12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_variableNames.addElement(ev.getName()); 12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private ExpandedNameTable m_ent = new ExpandedNameTable(); 12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given a qualified name, return an integer ID that can be 12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * quickly compared. 12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param qname a qualified name object, must not be null. 12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the expanded-name id of the qualified name. 12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getQNameID(QName qname) 12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_ent.getExpandedTypeID(qname.getNamespace(), 12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson qname.getLocalName(), 12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // The type doesn't matter for our 12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // purposes. 12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson org.apache.xml.dtm.DTM.ELEMENT_NODE); 12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * A Vector of the current params and QNames within the current template. 12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set by ElemTemplate and used by ProcessorVariable. 12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private java.util.Vector m_variableNames = new java.util.Vector(); 12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Add the name of a qualified name within the template. The position in 12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the vector is its ID. 12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param qname A qualified name of a param or variable, should be non-null. 12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the index where the variable was added. 12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int addVariableName(final org.apache.xml.utils.QName qname) 12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int pos = m_variableNames.size(); 12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_variableNames.addElement(qname); 12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int frameSize = m_variableNames.size() - getGlobalsSize(); 12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(frameSize > m_maxStackFrameSize) 12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_maxStackFrameSize++; 12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return pos; 12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void resetStackFrameSize() 13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_maxStackFrameSize = 0; 13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int getFrameSize() 13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_maxStackFrameSize; 13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the current size of the stack frame. Use this to record the position 13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in a template element at startElement, so that it can be popped 13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * at endElement. 13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int getCurrentStackFrameSize() 13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_variableNames.size(); 13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the current size of the stack frame. 13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void setCurrentStackFrameSize(int sz) 13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_variableNames.setSize(sz); 13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int getGlobalsSize() 13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_variables.size(); 13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson IntStack m_marks = new IntStack(); 13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void pushStackMark() 13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_marks.push(getCurrentStackFrameSize()); 13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void popStackMark() 13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int mark = m_marks.pop(); 13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setCurrentStackFrameSize(mark); 13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the Vector of the current params and QNames to be collected 13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * within the current template. 13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A reference to the vector of variable names. The reference 13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * returned is owned by this class, and so should not really be mutated, or 13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * stored anywhere. 13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson java.util.Vector getVariableNames() 13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_variableNames; 13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private int m_maxStackFrameSize; 13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Optimization flag 13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean getOptimizer() { 13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_optimizer; 13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param b Optimization flag 13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setOptimizer(boolean b) { 13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_optimizer = b; 13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Incremental flag 13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean getIncremental() { 13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_incremental; 13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return source location flag 13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean getSource_location() { 13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_source_location; 13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param b Incremental flag 13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setIncremental(boolean b) { 13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_incremental = b; 13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param b Source location flag 14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setSource_location(boolean b) { 14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_source_location = b; 14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 1406