You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sb...@locus.apache.org on 2000/02/22 03:19:16 UTC
cvs commit: xml-xalan/src/org/apache/xalan/xslt ElemApplyTemplates.java ElemCallTemplate.java ElemForEach.java ElemTemplateElement.java TemplateElementContext.java VariableStack.java
sboag 00/02/21 18:19:16
Modified: src/org/apache/xalan/xslt ElemApplyTemplates.java
ElemCallTemplate.java ElemForEach.java
ElemTemplateElement.java
TemplateElementContext.java VariableStack.java
Log:
Fix setting of variable context for xsl:apply-templates, and (ugh) set switching of stack frames for depth-first selection.
Revision Changes Path
1.6 +13 -5 xml-xalan/src/org/apache/xalan/xslt/ElemApplyTemplates.java
Index: ElemApplyTemplates.java
===================================================================
RCS file: /home/cvs/xml-xalan/src/org/apache/xalan/xslt/ElemApplyTemplates.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ElemApplyTemplates.java 2000/02/21 08:14:27 1.5
+++ ElemApplyTemplates.java 2000/02/22 02:19:14 1.6
@@ -150,11 +150,17 @@
mode = m_mode;
}
+ // Dragons here. Push the params & stack frame, but then
+ // execute the select statement inside transformSelectedChildren,
+ // which must be executed in the stack frame before the
+ // new stack frame. Because of depth-first searching, this
+ // gets worse.
+ int selectStackFrameIndex = processor.getVarStack().getCurrentStackFrameIndex();
processor.getVarStack().pushParams(processor,
- m_stylesheet,
- this,
- sourceTree,
- sourceNode, mode);
+ m_stylesheet,
+ this,
+ sourceTree,
+ sourceNode, mode);
try
{
@@ -165,7 +171,8 @@
sourceNode, mode,
m_selectPattern,
Constants.ELEMNAME_APPLY_TEMPLATES,
- processor);
+ processor,
+ selectStackFrameIndex);
}
finally
{
@@ -174,6 +181,7 @@
processor.m_needToCheckForInfiniteLoops = false;
}
processor.getVarStack().popCurrentContext();
+ processor.getVarStack().setCurrentStackFrameIndex(selectStackFrameIndex);
}
}
else // if(null == sourceNode)
1.7 +2 -0 xml-xalan/src/org/apache/xalan/xslt/ElemCallTemplate.java
Index: ElemCallTemplate.java
===================================================================
RCS file: /home/cvs/xml-xalan/src/org/apache/xalan/xslt/ElemCallTemplate.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ElemCallTemplate.java 2000/02/21 08:14:27 1.6
+++ ElemCallTemplate.java 2000/02/22 02:19:14 1.7
@@ -114,6 +114,7 @@
}
if(null != m_template)
{
+ int savedFrameIndex = processor.getVarStack().getCurrentStackFrameIndex();
try
{
processor.getVarStack().pushParams(processor,
@@ -128,6 +129,7 @@
finally
{
processor.getVarStack().popCurrentContext();
+ processor.getVarStack().setCurrentStackFrameIndex(savedFrameIndex);
}
}
else
1.5 +2 -1 xml-xalan/src/org/apache/xalan/xslt/ElemForEach.java
Index: ElemForEach.java
===================================================================
RCS file: /home/cvs/xml-xalan/src/org/apache/xalan/xslt/ElemForEach.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ElemForEach.java 2000/02/11 15:42:39 1.4
+++ ElemForEach.java 2000/02/22 02:19:14 1.5
@@ -127,7 +127,8 @@
sourceNode, mode,
m_selectPattern,
Constants.ELEMNAME_FOREACH,
- processor);
+ processor,
+ processor.getVarStack().getCurrentStackFrameIndex());
}
else // if(null == sourceNode)
{
1.20 +70 -44 xml-xalan/src/org/apache/xalan/xslt/ElemTemplateElement.java
Index: ElemTemplateElement.java
===================================================================
RCS file: /home/cvs/xml-xalan/src/org/apache/xalan/xslt/ElemTemplateElement.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- ElemTemplateElement.java 2000/02/21 08:14:27 1.19
+++ ElemTemplateElement.java 2000/02/22 02:19:14 1.20
@@ -819,16 +819,19 @@
* @param selectPattern The XPath with which to perform the selection.
* @param xslToken The current XSLT instruction (depricated -- I do not
* think we want this).
+ * @param tcontext The XSLTEngineImpl context.
+ * @param selectStackFrameIndex The stack frame context for executing the
+ * select statement.
*/
- protected void transformSelectedChildren(
- Stylesheet stylesheetTree,
+ protected void transformSelectedChildren(Stylesheet stylesheetTree,
ElemTemplateElement xslInstruction, // xsl:apply-templates or xsl:for-each
ElemTemplateElement template, // The template to copy to the result tree
Node sourceTree,
Node sourceNodeContext, QName mode,
XPath selectPattern,
int xslToken,
- XSLTEngineImpl tcontext)
+ XSLTEngineImpl tcontext,
+ int selectStackFrameIndex)
throws XSLProcessorException,
java.net.MalformedURLException,
java.io.FileNotFoundException,
@@ -848,6 +851,9 @@
{
XPathSupport execContext = tcontext.getXMLProcessorLiaison();
+ int savedCurrentStackFrameIndex =tcontext.getVarStack().getCurrentStackFrameIndex();
+ tcontext.getVarStack().setCurrentStackFrameIndex(selectStackFrameIndex);
+
// Optimization note: is there a way we can keep from creating
// a new callback context every time?
TemplateElementContext callbackContext
@@ -858,21 +864,28 @@
sourceNodeContext,
mode,
xslToken,
- tcontext) : null;
-
- XObject result = selectPattern.execute(execContext, sourceNodeContext,
- xslInstruction, callback,
- callbackContext, false);
- sourceNodes = result.nodeset();
+ tcontext,
+ savedCurrentStackFrameIndex) : null;
- if(null != m_stylesheet.m_stylesheetRoot.m_traceListeners)
+ try
+ {
+ XObject result = selectPattern.execute(execContext, sourceNodeContext,
+ xslInstruction, callback,
+ callbackContext, false);
+ sourceNodes = result.nodeset();
+ if(null != m_stylesheet.m_stylesheetRoot.m_traceListeners)
+ {
+ m_stylesheet.m_stylesheetRoot.fireSelectedEvent(new SelectionEvent(tcontext,
+ sourceNodeContext,
+ this,
+ "select",
+ selectPattern,
+ result));
+ }
+ }
+ finally
{
- m_stylesheet.m_stylesheetRoot.fireSelectedEvent(new SelectionEvent(tcontext,
- sourceNodeContext,
- this,
- "select",
- selectPattern,
- result));
+ tcontext.getVarStack().setCurrentStackFrameIndex(savedCurrentStackFrameIndex);
}
// System.out.println(sourceNodes.getLength());
@@ -888,7 +901,7 @@
}
sourceNodes = msourceNodes;
}
-
+
if(null != sourceNodes)
{
int nNodes = sourceNodes.getLength();
@@ -1003,8 +1016,12 @@
{
TemplateElementContext templateContext = (TemplateElementContext)callbackInfo;
+ VariableStack stack = templateContext.m_transformContext.getVarStack();
+ int savedCurrentStackFrameIndex =stack.getCurrentStackFrameIndex();
+ stack.setCurrentStackFrameIndex(templateContext.m_stackFrameIndex);
+
try
- {
+ {
transformChild(templateContext.m_stylesheetTree,
templateContext.m_xslInstruction, // xsl:apply-templates or xsl:for-each
templateContext.m_template, // may be null
@@ -1027,6 +1044,10 @@
{
throw new XSLProcessorException(ioe);
}
+ finally
+ {
+ stack.setCurrentStackFrameIndex(savedCurrentStackFrameIndex);
+ }
/*
catch(Exception mue)
{
@@ -1105,41 +1126,46 @@
}
}
- if(null != template)
+ try
{
- transformContext.resetCurrentState(child);
-
- if(template == m_stylesheet.m_stylesheetRoot.m_defaultTextRule)
+ if(null != template)
{
- switch(nodeType)
+ transformContext.resetCurrentState(child);
+
+ if(template == m_stylesheet.m_stylesheetRoot.m_defaultTextRule)
{
- case Node.CDATA_SECTION_NODE:
- case Node.TEXT_NODE:
- transformContext.cloneToResultTree(stylesheetTree, child, false, false, false);
- break;
- case Node.ATTRIBUTE_NODE:
+ switch(nodeType)
{
- Attr attr = (Attr)child;
- String val = attr.getValue();
- transformContext.m_resultTreeHandler.characters(val.toCharArray(), 0, val.length());
+ case Node.CDATA_SECTION_NODE:
+ case Node.TEXT_NODE:
+ transformContext.cloneToResultTree(stylesheetTree, child, false, false, false);
+ break;
+ case Node.ATTRIBUTE_NODE:
+ {
+ Attr attr = (Attr)child;
+ String val = attr.getValue();
+ transformContext.m_resultTreeHandler.characters(val.toCharArray(), 0, val.length());
+ }
+ break;
}
- break;
}
- }
- else
- {
- if(null != m_stylesheet.m_stylesheetRoot.m_traceListeners)
+ else
{
- TracerEvent te = new TracerEvent(transformContext,
- sourceTree,
- child,
- mode,
- template);
- m_stylesheet.m_stylesheetRoot.fireTraceEvent(te);
+ if(null != m_stylesheet.m_stylesheetRoot.m_traceListeners)
+ {
+ TracerEvent te = new TracerEvent(transformContext,
+ sourceTree,
+ child,
+ mode,
+ template);
+ m_stylesheet.m_stylesheetRoot.fireTraceEvent(te);
+ }
+ template.executeChildren(transformContext, sourceTree, child, mode);
}
- template.executeChildren(transformContext, sourceTree, child, mode);
}
-
+ }
+ finally
+ {
transformContext.resetCurrentState(selectContext);
}
return true;
1.2 +4 -1 xml-xalan/src/org/apache/xalan/xslt/TemplateElementContext.java
Index: TemplateElementContext.java
===================================================================
RCS file: /home/cvs/xml-xalan/src/org/apache/xalan/xslt/TemplateElementContext.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- TemplateElementContext.java 1999/12/13 08:22:54 1.1
+++ TemplateElementContext.java 2000/02/22 02:19:14 1.2
@@ -19,7 +19,8 @@
Node sourceNodeContext,
QName mode,
int xslToken,
- XSLTEngineImpl transformContext)
+ XSLTEngineImpl transformContext,
+ int stackFrameIndex)
{
m_stylesheetTree = stylesheetTree;
m_xslInstruction = xslInstruction;
@@ -28,6 +29,7 @@
m_mode = mode;
m_xslToken = xslToken;
m_transformContext = transformContext;
+ m_stackFrameIndex = stackFrameIndex;
}
Stylesheet m_stylesheetTree;
@@ -37,4 +39,5 @@
QName m_mode;
int m_xslToken;
XSLTEngineImpl m_transformContext;
+ int m_stackFrameIndex;
}
1.2 +32 -3 xml-xalan/src/org/apache/xalan/xslt/VariableStack.java
Index: VariableStack.java
===================================================================
RCS file: /home/cvs/xml-xalan/src/org/apache/xalan/xslt/VariableStack.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- VariableStack.java 2000/02/21 08:14:28 1.1
+++ VariableStack.java 2000/02/22 02:19:14 1.2
@@ -35,6 +35,33 @@
private static final Arg m_elemFrameBoundry = new Arg();
/**
+ * This is the top of the stack frame from where a search
+ * for a variable or param should take place. It may not
+ * be the real stack top.
+ */
+ private int m_currentStackFrameIndex = -1;
+
+ /**
+ * Set the top of the stack frame from where a search
+ * for a variable or param should take place.
+ */
+ void setCurrentStackFrameIndex(int currentStackFrameIndex)
+ {
+ m_currentStackFrameIndex = currentStackFrameIndex;
+ }
+
+ /**
+ * Get the top of the stack frame from where a search
+ * for a variable or param should take place.
+ */
+ int getCurrentStackFrameIndex()
+ {
+ if(-1 == m_currentStackFrameIndex)
+ return this.size();
+ return m_currentStackFrameIndex;
+ }
+
+ /**
* Constructor for a variable stack.
*/
VariableStack()
@@ -124,6 +151,7 @@
m_paramsTemp.removeAllElements();
}
+ m_currentStackFrameIndex = this.size();
} // end pushParams method
@@ -136,8 +164,8 @@
throws SAXException
{
XObject val = null;
- int nElems = size();
- // Sub 1 extra for the context marker.
+ int nElems = getCurrentStackFrameIndex();
+
for(int i = (nElems - 1); i >= 0; i--)
{
Object obj = elementAt(i);
@@ -163,7 +191,7 @@
public Object getVariable(QName name)
throws SAXException
{
- int nElems = size();
+ int nElems = getCurrentStackFrameIndex();
// Sub 1 extra for the context marker.
for(int i = (nElems - 1); i >= 0; i--)
{
@@ -209,6 +237,7 @@
public void pushVariable(QName qname, XObject val)
{
push(new Arg(qname, val, false));
+ m_currentStackFrameIndex = this.size();
}
/**