final int sourceNode = xctxt.getCurrentNode();
DTMIterator sourceNodes = m_selectExpression.asIterator(xctxt, sourceNode);
VariableStack vars = xctxt.getVarStack();
int nParams = getParamElemCount();
int thisframe = vars.getStackFrame();
StackGuard guard = transformer.getStackGuard();
boolean check = (guard.getRecursionLimit() > -1) ? true : false;
boolean pushContextNodeListFlag = false;
try
{
xctxt.pushCurrentNode(DTM.NULL);
xctxt.pushCurrentExpressionNode(DTM.NULL);
xctxt.pushSAXLocatorNull();
transformer.pushElemTemplateElement(null);
final Vector keys = (m_sortElems == null)
? null
: transformer.processSortKeys(this, sourceNode);
// Sort if we need to.
if (null != keys)
sourceNodes = sortNodes(xctxt, keys, sourceNodes);
if (TransformerImpl.S_DEBUG)
{
transformer.getTraceManager().fireSelectedEvent(sourceNode, this,
"select", new XPath(m_selectExpression),
new org.apache.xpath.objects.XNodeSet(sourceNodes));
}
final SerializationHandler rth = transformer.getSerializationHandler();
// ContentHandler chandler = rth.getContentHandler();
final StylesheetRoot sroot = transformer.getStylesheet();
final TemplateList tl = sroot.getTemplateListComposed();
final boolean quiet = transformer.getQuietConflictWarnings();
// Should be able to get this from the iterator but there must be a bug.
DTM dtm = xctxt.getDTM(sourceNode);
int argsFrame = -1;
if(nParams > 0)
{
// This code will create a section on the stack that is all the
// evaluated arguments. These will be copied into the real params
// section of each called template.
argsFrame = vars.link(nParams);
vars.setStackFrame(thisframe);
for (int i = 0; i < nParams; i++)
{
ElemWithParam ewp = m_paramElems[i];
if (TransformerImpl.S_DEBUG)
transformer.getTraceManager().fireTraceEvent(ewp);
XObject obj = ewp.getValue(transformer, sourceNode);
if (TransformerImpl.S_DEBUG)
transformer.getTraceManager().fireTraceEndEvent(ewp);
vars.setLocalVariable(i, obj, argsFrame);
}
vars.setStackFrame(argsFrame);
}
xctxt.pushContextNodeList(sourceNodes);
pushContextNodeListFlag = true;
IntStack currentNodes = xctxt.getCurrentNodeStack();
IntStack currentExpressionNodes = xctxt.getCurrentExpressionNodeStack();
// pushParams(transformer, xctxt);
int child;
while (DTM.NULL != (child = sourceNodes.nextNode()))
{
currentNodes.setTop(child);
currentExpressionNodes.setTop(child);
if(xctxt.getDTM(child) != dtm)
{
dtm = xctxt.getDTM(child);
}
final int exNodeType = dtm.getExpandedTypeID(child);
final int nodeType = dtm.getNodeType(child);
final QName mode = transformer.getMode();
ElemTemplate template = tl.getTemplateFast(xctxt, child, exNodeType, mode,
-1, quiet, dtm);
// If that didn't locate a node, fall back to a default template rule.
// See http://www.w3.org/TR/xslt#built-in-rule.
if (null == template)
{
switch (nodeType)
{
case DTM.DOCUMENT_FRAGMENT_NODE :
case DTM.ELEMENT_NODE :
template = sroot.getDefaultRule();
// %OPT% direct faster?
break;
case DTM.ATTRIBUTE_NODE :
case DTM.CDATA_SECTION_NODE :
case DTM.TEXT_NODE :
// if(rth.m_elemIsPending || rth.m_docPending)
// rth.flushPending(true);
transformer.pushPairCurrentMatched(sroot.getDefaultTextRule(), child);
transformer.setCurrentElement(sroot.getDefaultTextRule());
// dtm.dispatchCharactersEvents(child, chandler, false);
dtm.dispatchCharactersEvents(child, rth, false);
transformer.popCurrentMatched();
continue;
case DTM.DOCUMENT_NODE :
template = sroot.getDefaultRootRule();
break;
default :
// No default rules for processing instructions and the like.
continue;
}
}
else
{
transformer.setCurrentElement(template);
}
transformer.pushPairCurrentMatched(template, child);
if (check)
guard.checkForInfinateLoop();
int currentFrameBottom; // See comment with unlink, below
if(template.m_frameSize > 0)
{
xctxt.pushRTFContext();