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: ElemApplyTemplates.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.TransformerImpl;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMIterator;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.SerializationHandler;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.IntStack;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.QName;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.VariableStack;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPath;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXException;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Implement xsl:apply-templates.
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <pre>
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * &amp;!ELEMENT xsl:apply-templates (xsl:sort|xsl:with-param)*>
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * &amp;!ATTLIST xsl:apply-templates
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   select %expr; "node()"
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   mode %qname; #IMPLIED
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * &amp;
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre>
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#section-Applying-Template-Rules">section-Applying-Template-Rules in XSLT Specification</a>
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class ElemApplyTemplates extends ElemCallTemplate
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = 2903125371542621004L;
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * mode %qname; #IMPLIED
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private QName m_mode = null;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the mode attribute for this element.
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mode reference, which may be null, to the <a href="http://www.w3.org/TR/xslt#modes">current mode</a>.
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setMode(QName mode)
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_mode = mode;
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the mode attribute for this element.
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The mode attribute for this element
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public QName getMode()
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_mode;
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tells if this belongs to a default template,
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in which case it will act different with
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * regard to processing modes.
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#built-in-rule">built-in-rule in XSLT Specification</a>
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_isDefaultTemplate = false;
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * List of namespace/localname IDs, for identification of xsl:with-param to
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * xsl:params.  Initialized in the compose() method.
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  private int[] m_paramIDs;
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set if this belongs to a default template,
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in which case it will act different with
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * regard to processing modes.
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#built-in-rule">built-in-rule in XSLT Specification</a>
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param b boolean value to set.
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setIsDefaultTemplate(boolean b)
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_isDefaultTemplate = b;
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an int constant identifying the type of element.
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xalan.templates.Constants
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Token ID for this element types
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getXSLToken()
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return Constants.ELEMNAME_APPLY_TEMPLATES;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This function is called after everything else has been
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * recomposed, and allows the template to set remaining
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * values that may be based on some other property that
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * depends on recomposition.
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void compose(StylesheetRoot sroot) throws TransformerException
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super.compose(sroot);
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the node name.
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Element name
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNodeName()
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return Constants.ELEMNAME_APPLY_TEMPLATES_STRING;
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Apply the context node to the matching templates.
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#section-Applying-Template-Rules">section-Applying-Template-Rules in XSLT Specification</a>
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param transformer non-null reference to the the current transform-time state.
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void execute(TransformerImpl transformer) throws TransformerException
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    transformer.pushCurrentTemplateRuleIsNull(false);
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean pushMode = false;
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %REVIEW% Do we need this check??
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      if (null != sourceNode)
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      {
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // boolean needToTurnOffInfiniteLoopCheck = false;
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      QName mode = transformer.getMode();
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!m_isDefaultTemplate)
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (((null == mode) && (null != m_mode))
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || ((null != mode) &&!mode.equals(m_mode)))
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          pushMode = true;
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          transformer.pushMode(m_mode);
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      transformSelectedNodes(transformer);
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (pushMode)
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        transformer.popMode();
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      transformer.popCurrentTemplateRuleIsNull();
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Perform a query if needed, and call transformNode for each child.
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param transformer non-null reference to the the current transform-time state.
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException Thrown in a variety of circumstances.
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void transformSelectedNodes(TransformerImpl transformer)
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    final XPathContext xctxt = transformer.getXPathContext();
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    final int sourceNode = xctxt.getCurrentNode();
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTMIterator sourceNodes = m_selectExpression.asIterator(xctxt, sourceNode);
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    VariableStack vars = xctxt.getVarStack();
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nParams = getParamElemCount();
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int thisframe = vars.getStackFrame();
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean pushContextNodeListFlag = false;
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xctxt.pushCurrentNode(DTM.NULL);
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xctxt.pushCurrentExpressionNode(DTM.NULL);
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xctxt.pushSAXLocatorNull();
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            transformer.pushElemTemplateElement(null);
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final Vector keys = (m_sortElems == null)
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          ? null
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          : transformer.processSortKeys(this, sourceNode);
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Sort if we need to.
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != keys)
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        sourceNodes = sortNodes(xctxt, keys, sourceNodes);
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final SerializationHandler rth = transformer.getSerializationHandler();
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      ContentHandler chandler = rth.getContentHandler();
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final StylesheetRoot sroot = transformer.getStylesheet();
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final TemplateList tl = sroot.getTemplateListComposed();
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      final boolean quiet = transformer.getQuietConflictWarnings();
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Should be able to get this from the iterator but there must be a bug.
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTM dtm = xctxt.getDTM(sourceNode);
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int argsFrame = -1;
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(nParams > 0)
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // This code will create a section on the stack that is all the
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // evaluated arguments.  These will be copied into the real params
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // section of each called template.
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        argsFrame = vars.link(nParams);
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        vars.setStackFrame(thisframe);
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 0; i < nParams; i++)
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ElemWithParam ewp = m_paramElems[i];
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XObject obj = ewp.getValue(transformer, sourceNode);
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          vars.setLocalVariable(i, obj, argsFrame);
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        vars.setStackFrame(argsFrame);
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.pushContextNodeList(sourceNodes);
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      pushContextNodeListFlag = true;
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      IntStack currentNodes = xctxt.getCurrentNodeStack();
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      IntStack currentExpressionNodes = xctxt.getCurrentExpressionNodeStack();
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // pushParams(transformer, xctxt);
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int child;
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (child = sourceNodes.nextNode()))
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        currentNodes.setTop(child);
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        currentExpressionNodes.setTop(child);
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(xctxt.getDTM(child) != dtm)
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          dtm = xctxt.getDTM(child);
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int exNodeType = dtm.getExpandedTypeID(child);
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final int nodeType = dtm.getNodeType(child);
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final QName mode = transformer.getMode();
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ElemTemplate template = tl.getTemplateFast(xctxt, child, exNodeType, mode,
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      -1, quiet, dtm);
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If that didn't locate a node, fall back to a default template rule.
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // See http://www.w3.org/TR/xslt#built-in-rule.
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == template)
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          switch (nodeType)
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          case DTM.DOCUMENT_FRAGMENT_NODE :
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          case DTM.ELEMENT_NODE :
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            template = sroot.getDefaultRule();
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // %OPT% direct faster?
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          case DTM.ATTRIBUTE_NODE :
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          case DTM.CDATA_SECTION_NODE :
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          case DTM.TEXT_NODE :
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // if(rth.m_elemIsPending || rth.m_docPending)
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //  rth.flushPending(true);
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            transformer.pushPairCurrentMatched(sroot.getDefaultTextRule(), child);
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            transformer.setCurrentElement(sroot.getDefaultTextRule());
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // dtm.dispatchCharactersEvents(child, chandler, false);
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            dtm.dispatchCharactersEvents(child, rth, false);
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            transformer.popCurrentMatched();
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            continue;
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          case DTM.DOCUMENT_NODE :
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            template = sroot.getDefaultRootRule();
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          default :
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // No default rules for processing instructions and the like.
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            continue;
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        	transformer.setCurrentElement(template);
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        transformer.pushPairCurrentMatched(template, child);
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int currentFrameBottom;  // See comment with unlink, below
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(template.m_frameSize > 0)
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.pushRTFContext();
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          currentFrameBottom = vars.getStackFrame();  // See comment with unlink, below
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          vars.link(template.m_frameSize);
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // You can't do the check for nParams here, otherwise the
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // xsl:params might not be nulled.
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if(/* nParams > 0 && */ template.m_inArgsSize > 0)
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int paramIndex = 0;
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            for (ElemTemplateElement elem = template.getFirstChildElem();
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 null != elem; elem = elem.getNextSiblingElem())
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if(Constants.ELEMNAME_PARAMVARIABLE == elem.getXSLToken())
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              {
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ElemParam ep = (ElemParam)elem;
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                int i;
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                for (i = 0; i < nParams; i++)
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  ElemWithParam ewp = m_paramElems[i];
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  if(ewp.m_qnameID == ep.m_qnameID)
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  {
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    XObject obj = vars.getLocalVariable(i, argsFrame);
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    vars.setLocalVariable(paramIndex, obj);
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    break;
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  }
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if(i == nParams)
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  vars.setLocalVariable(paramIndex, null);
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              else
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                break;
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              paramIndex++;
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        	currentFrameBottom = 0;
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // And execute the child templates.
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Loop through the children of the template, calling execute on
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // each of them.
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (ElemTemplateElement t = template.m_firstChild;
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             t != null; t = t.m_nextSibling)
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.setSAXLocator(t);
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          try
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          	transformer.pushElemTemplateElement(t);
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          	t.execute(transformer);
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          finally
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          	transformer.popElemTemplateElement();
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(template.m_frameSize > 0)
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // See Frank Weiss bug around 03/19/2002 (no Bugzilla report yet).
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // While unlink will restore to the proper place, the real position
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // may have been changed for xsl:with-param, so that variables
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // can be accessed.
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // of right now.
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // More:
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // When we entered this function, the current
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // frame buffer (cfb) index in the variable stack may
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // have been manually set.  If we just call
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // unlink(), however, it will restore the cfb to the
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // previous link index from the link stack, rather than
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // the manually set cfb.  So,
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // the only safe solution is to restore it back
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // to the same position it was on entry, since we're
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // really not working in a stack context here. (Bug4218)
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          vars.unlink(currentFrameBottom);
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.popRTFContext();
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        transformer.popCurrentMatched();
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } // end while (DTM.NULL != (child = sourceNodes.nextNode()))
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (SAXException se)
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      transformer.getErrorListener().fatalError(new TransformerException(se));
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Unlink to the original stack frame
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(nParams > 0)
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        vars.unlink(thisframe);
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popSAXLocator();
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (pushContextNodeListFlag) 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}
422