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: ElemForEach.java 468643 2006-10-28 06:56:03Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.templates; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.NodeSorter; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TransformerImpl; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMIterator; 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMManager; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.IntStack; 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.Expression; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExpressionOwner; 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPath; 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext; 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.ObjectInputStream; 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.IOException; 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Implement xsl:for-each. 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <pre> 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <!ELEMENT xsl:for-each 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (#PCDATA 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * %instructions; 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * %result-elements; 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * | xsl:sort) 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * > 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <!ATTLIST xsl:for-each 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * select %expr; #REQUIRED 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * %space-att; 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * > 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre> 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#for-each">for-each in XSLT Specification</a> 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class ElemForEach extends ElemTemplateElement implements ExpressionOwner 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final long serialVersionUID = 6018140636363583690L; 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Set true to request some basic status reports */ 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final boolean DEBUG = false; 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This is set by an "xalan-doc-cache-off" pi, or the old "xalan:doc-cache-off" pi. 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The old form of the PI only works for XML parsers that are not namespace aware. 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * It tells the engine that 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * documents created in the location paths executed by this element 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * will not be reparsed. It's set by StylesheetHandler during 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * construction. Note that this feature applies _only_ to xsl:for-each 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * elements in its current incarnation; a more general cache management 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * solution is desperately needed. 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean m_doc_cache_off=false; 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Construct a element representing xsl:for-each. 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemForEach(){} 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The "select" expression. 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected Expression m_selectExpression = null; 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Used to fix bug#16889 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Store XPath away for later processing. 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected XPath m_xpath = null; 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the "select" attribute. 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xpath The XPath expression for the "select" attribute. 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setSelect(XPath xpath) 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_selectExpression = xpath.getExpression(); 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // The following line is part of the codes added to fix bug#16889 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Store xpath which will be needed when firing Selected Event 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_xpath = xpath; 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the "select" attribute. 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The XPath expression for the "select" attribute. 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Expression getSelect() 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_selectExpression; 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This function is called after everything else has been 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * recomposed, and allows the template to set remaining 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * values that may be based on some other property that 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * depends on recomposition. 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * NEEDSDOC @param sroot 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void compose(StylesheetRoot sroot) throws TransformerException 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.compose(sroot); 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int length = getSortElemCount(); 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < length; i++) 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson getSortElem(i).compose(sroot); 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson java.util.Vector vnames = sroot.getComposeState().getVariableNames(); 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_selectExpression) 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_selectExpression.fixupVariables( 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson vnames, sroot.getComposeState().getGlobalsSize()); 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_selectExpression = 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson getStylesheetRoot().m_selectDefault.getExpression(); 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This after the template's children have been composed. 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void endCompose(StylesheetRoot sroot) throws TransformerException 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int length = getSortElemCount(); 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < length; i++) 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson getSortElem(i).endCompose(sroot); 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.endCompose(sroot); 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // /** 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // * This function is called after everything else has been 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // * recomposed, and allows the template to set remaining 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // * values that may be based on some other property that 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // * depends on recomposition. 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // * 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // * @throws TransformerException 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // */ 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // public void compose() throws TransformerException 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // { 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // if (null == m_selectExpression) 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // { 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // m_selectExpression = 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // getStylesheetRoot().m_selectDefault.getExpression(); 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // } 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // } 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Vector containing the xsl:sort elements associated with this element. 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected Vector m_sortElems = null; 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the count xsl:sort elements associated with this element. 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The number of xsl:sort elements. 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getSortElemCount() 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (m_sortElems == null) ? 0 : m_sortElems.size(); 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get a xsl:sort element associated with this element. 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param i Index of xsl:sort element to get 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return xsl:sort element at given index 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemSort getSortElem(int i) 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (ElemSort) m_sortElems.elementAt(i); 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set a xsl:sort element associated with this element. 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param sortElem xsl:sort element to set 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setSortElem(ElemSort sortElem) 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_sortElems) 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_sortElems = new Vector(); 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_sortElems.addElement(sortElem); 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get an int constant identifying the type of element. 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.apache.xalan.templates.Constants 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The token ID for this element 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getXSLToken() 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return Constants.ELEMNAME_FOREACH; 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the node name. 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The element's name 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getNodeName() 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return Constants.ELEMNAME_FOREACH_STRING; 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute the xsl:for-each transformation 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param transformer non-null reference to the the current transform-time state. 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void execute(TransformerImpl transformer) throws TransformerException 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson transformer.pushCurrentTemplateRuleIsNull(true); 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson transformSelectedNodes(transformer); 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson transformer.popCurrentTemplateRuleIsNull(); 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get template element associated with this 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return template element associated with this (itself) 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected ElemTemplateElement getTemplateMatch() 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return this; 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Sort given nodes 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt The XPath runtime state for the sort. 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param keys Vector of sort keyx 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param sourceNodes Iterator of nodes to sort 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return iterator of sorted nodes 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public DTMIterator sortNodes( 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPathContext xctxt, Vector keys, DTMIterator sourceNodes) 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson NodeSorter sorter = new NodeSorter(xctxt); 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson sourceNodes.setShouldCacheNodes(true); 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson sourceNodes.runTo(-1); 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushContextNodeList(sourceNodes); 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson sorter.sort(sourceNodes, keys, xctxt); 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson sourceNodes.setCurrentPos(0); 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popContextNodeList(); 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return sourceNodes; 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Perform a query if needed, and call transformNode for each child. 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param transformer non-null reference to the the current transform-time state. 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException Thrown in a variety of circumstances. 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void transformSelectedNodes(TransformerImpl transformer) 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final XPathContext xctxt = transformer.getXPathContext(); 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final int sourceNode = xctxt.getCurrentNode(); 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTMIterator sourceNodes = m_selectExpression.asIterator(xctxt, 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson sourceNode); 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final Vector keys = (m_sortElems == null) 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? null 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson : transformer.processSortKeys(this, sourceNode); 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Sort if we need to. 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != keys) 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson sourceNodes = sortNodes(xctxt, keys, sourceNodes); 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentNode(DTM.NULL); 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson IntStack currentNodes = xctxt.getCurrentNodeStack(); 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentExpressionNode(DTM.NULL); 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson IntStack currentExpressionNodes = xctxt.getCurrentExpressionNodeStack(); 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushSAXLocatorNull(); 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushContextNodeList(sourceNodes); 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson transformer.pushElemTemplateElement(null); 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // pushParams(transformer, xctxt); 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Should be able to get this from the iterator but there must be a bug. 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM dtm = xctxt.getDTM(sourceNode); 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int docID = sourceNode & DTMManager.IDENT_DTM_DEFAULT; 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int child; 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (DTM.NULL != (child = sourceNodes.nextNode())) 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson currentNodes.setTop(child); 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson currentExpressionNodes.setTop(child); 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((child & DTMManager.IDENT_DTM_DEFAULT) != docID) 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dtm = xctxt.getDTM(child); 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson docID = child & DTMManager.IDENT_DTM_DEFAULT; 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //final int exNodeType = dtm.getExpandedTypeID(child); 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson final int nodeType = dtm.getNodeType(child); 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // And execute the child templates. 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Loop through the children of the template, calling execute on 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // each of them. 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (ElemTemplateElement t = this.m_firstChild; t != null; 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson t = t.m_nextSibling) 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.setSAXLocator(t); 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson transformer.setCurrentElement(t); 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson t.execute(transformer); 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // KLUGE: Implement <?xalan:doc_cache_off?> 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // ASSUMPTION: This will be set only when the XPath was indeed 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // a call to the Document() function. Calling it in other 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // situations is likely to fry Xalan. 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // %REVIEW% We need a MUCH cleaner solution -- one that will 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // handle cleaning up after document() and getDTM() in other 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // contexts. The whole SourceTreeManager mechanism should probably 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // be moved into DTMManager rather than being explicitly invoked in 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // FuncDocument and here. 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(m_doc_cache_off) 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(DEBUG) 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("JJK***** CACHE RELEASE *****\n"+ 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "\tdtm="+dtm.getDocumentBaseURI()); 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // NOTE: This will work because this is _NOT_ a shared DTM, and thus has 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // only a single Document node. If it could ever be an RTF or other 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // shared DTM, this would require substantial rework. 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.getSourceTreeManager().removeDocumentFromCache(dtm.getDocument()); 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.release(dtm,false); 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popSAXLocator(); 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popContextNodeList(); 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson transformer.popElemTemplateElement(); 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentExpressionNode(); 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentNode(); 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson sourceNodes.detach(); 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Add a child to the child list. 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <!ELEMENT xsl:apply-templates (xsl:sort|xsl:with-param)*> 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <!ATTLIST xsl:apply-templates 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * select %expr; "node()" 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * mode %qname; #IMPLIED 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * > 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param newChild Child to add to child list 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Child just added to child list 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement appendChild(ElemTemplateElement newChild) 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int type = ((ElemTemplateElement) newChild).getXSLToken(); 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (Constants.ELEMNAME_SORT == type) 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setSortElem((ElemSort) newChild); 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return newChild; 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return super.appendChild(newChild); 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Call the children visitors. 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param visitor The visitor whose appropriate method will be called. 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void callChildVisitors(XSLTVisitor visitor, boolean callAttributes) 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(callAttributes && (null != m_selectExpression)) 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_selectExpression.callVisitors(this, visitor); 4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int length = getSortElemCount(); 4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < length; i++) 4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson getSortElem(i).callVisitors(visitor); 4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.callChildVisitors(visitor, callAttributes); 4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExpressionOwner#getExpression() 4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Expression getExpression() 4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_selectExpression; 4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExpressionOwner#setExpression(Expression) 4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setExpression(Expression exp) 4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exp.exprSetParent(this); 4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_selectExpression = exp; 4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* 4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to keep the binary compatibility, assign a default value for newly added 4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * globel varialbe m_xpath during deserialization of an object which was 4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * serialized using an older version 4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private void readObject(ObjectInputStream os) throws 4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson IOException, ClassNotFoundException { 4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson os.defaultReadObject(); 4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_xpath = null; 4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 495