mmidy 00/04/07 12:38:46
Modified: src/org/apache/xalan/xslt Tag: Bxalan_1_0_0 ElemSort.java
ElemTemplateElement.java
Log:
Make sure we use correct variable stack frame index. Fixed problem with sort
and variable out of scope.
Revision Changes Path
No revision
No revision
1.6.2.1 +6 -20 xml-xalan/src/org/apache/xalan/xslt/ElemSort.java
Index: ElemSort.java
===================================================================
RCS file: /home/cvs/xml-xalan/src/org/apache/xalan/xslt/ElemSort.java,v
retrieving revision 1.6
retrieving revision 1.6.2.1
diff -u -r1.6 -r1.6.2.1
--- ElemSort.java 2000/03/02 10:23:03 1.6
+++ ElemSort.java 2000/04/07 19:38:46 1.6.2.1
@@ -102,34 +102,20 @@
}
else if(aname.equals(Constants.ATTRNAME_DATATYPE))
{
- String valType = atts.getValue(i);
- if (valType.equalsIgnoreCase(Constants.ATTRVAL_DATATYPE_TEXT)
||
-
valType.equalsIgnoreCase(Constants.ATTRVAL_DATATYPE_NUMBER))
- dataType_avt = new AVT(aname, atts.getType(i), valType,
+ dataType_avt = new AVT(aname, atts.getType(i),
atts.getValue(i),
this, m_stylesheet, processor);
- else
-
processor.error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE, new Object[]
{aname, valType});
+
}
else if(aname.equals(Constants.ATTRNAME_ORDER))
{
- String valOrder = atts.getValue(i);
- if
(valOrder.equalsIgnoreCase(Constants.ATTRVAL_ORDER_ASCENDING) ||
-
valOrder.equalsIgnoreCase(Constants.ATTRVAL_ORDER_DESCENDING))
- order_avt = new AVT(aname, atts.getType(i), valOrder,
- this, m_stylesheet, processor);
- else
-
processor.error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE, new Object[]
{aname, valOrder});
+ order_avt = new AVT(aname, atts.getType(i), atts.getValue(i),
+ this, m_stylesheet, processor);
}
else if(aname.equals(Constants.ATTRNAME_CASEORDER))
{
- String valCase = atts.getValue(i);
- if (valCase.equalsIgnoreCase(Constants.ATTRVAL_CASEORDER_UPPER)
||
-
valCase.equalsIgnoreCase(Constants.ATTRVAL_CASEORDER_LOWER))
-
- caseOrder_avt = new AVT(aname, atts.getType(i), valCase,
+ caseOrder_avt = new AVT(aname, atts.getType(i),
atts.getValue(i),
this, m_stylesheet, processor);
- else
-
processor.error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE, new Object[]
{aname, valCase});
+
}
else if(!isAttrOK(aname, atts, i))
{
1.27.2.2 +43 -9
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.27.2.1
retrieving revision 1.27.2.2
diff -u -r1.27.2.1 -r1.27.2.2
--- ElemTemplateElement.java 2000/03/16 18:12:19 1.27.2.1
+++ ElemTemplateElement.java 2000/04/07 19:38:46 1.27.2.2
@@ -164,7 +164,7 @@
*/
protected ElemTemplateElement m_firstChild;
- public String m_baseident;
+ private URL m_baseident;
/** Construct a template element instance.
*
@@ -214,7 +214,7 @@
}
}
}
- m_baseident = ((URL)m_stylesheet.m_includeStack.peek()).toExternalForm();
+ m_baseident = (URL)m_stylesheet.m_includeStack.peek();
//System.out.println("base " + m_baseident);
m_elemName = name;
@@ -338,7 +338,7 @@
{
String qnames = attrValue;
StringTokenizer tokenizer = new StringTokenizer(qnames, " \t\n\r",
false);
- String extensionElementPrefixes[] = new
String[tokenizer.countTokens()];
+ // String extensionElementPrefixes[] = new
String[tokenizer.countTokens()];
for(int k = 0; tokenizer.hasMoreTokens(); k++)
{
String eprefix = tokenizer.nextToken();
@@ -743,7 +743,8 @@
* Get the keys for the xsl:sort elements.
*/
private Vector processSortKeys(ElemTemplateElement xslInstruction,
- XSLTEngineImpl tcontext, Node
sourceNodeContext)
+ XSLTEngineImpl tcontext, Node
sourceNodeContext,
+ int selectStackFrameIndex)
throws SAXException
{
Vector keys = null;
@@ -755,6 +756,14 @@
ElemForEach foreach = (ElemForEach)xslInstruction;
if(null != foreach.m_sortElems)
{
+ // Since the stack frame has already been set for the
+ // new call, but we need to evaluate the sort attributes
+ // in the context of the caller, set the variable stack
+ // to the context where the selection occured.
+ VariableStack vars = tcontext.getVarStack();
+ int savedStackFrameIndex = vars.getCurrentStackFrameIndex();
+ vars.setCurrentStackFrameIndex(selectStackFrameIndex);
+
int nChildren = foreach.m_sortElems.size();
keys = new Vector();
@@ -768,17 +777,29 @@
: null;
String dataTypeString = sort.dataType_avt.evaluate(execContext,
sourceNodeContext, this,
new
StringBuffer());
+ if
(!(dataTypeString.equalsIgnoreCase(Constants.ATTRVAL_DATATYPE_TEXT)) &&
+
!(dataTypeString.equalsIgnoreCase(Constants.ATTRVAL_DATATYPE_NUMBER)))
+
error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE, new Object[]
{Constants.ATTRNAME_DATATYPE, dataTypeString});
+
boolean treatAsNumbers = ((null != dataTypeString)&&
dataTypeString.equals(Constants.ATTRVAL_DATATYPE_NUMBER)) ?
true : false;
String orderString = sort.order_avt.evaluate(execContext,
sourceNodeContext, this,
new StringBuffer());
+ if
(!(orderString.equalsIgnoreCase(Constants.ATTRVAL_ORDER_ASCENDING)) &&
+
!(orderString.equalsIgnoreCase(Constants.ATTRVAL_ORDER_DESCENDING)))
+
error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE, new Object[]
{Constants.ATTRNAME_ORDER, orderString});
+
boolean descending = ((null != orderString) &&
orderString.equals(Constants.ATTRVAL_ORDER_DESCENDING))?
true : false;
String caseOrderString = sort.caseOrder_avt.evaluate(execContext,
sourceNodeContext, this,
new
StringBuffer());
+ if
(!(caseOrderString.equalsIgnoreCase(Constants.ATTRVAL_CASEORDER_UPPER)) &&
+
!(caseOrderString.equalsIgnoreCase(Constants.ATTRVAL_CASEORDER_LOWER)))
+
error(XSLTErrorResources.ER_ILLEGAL_ATTRIBUTE_VALUE, new Object[]
{Constants.ATTRNAME_CASEORDER, caseOrderString});
+
boolean caseOrderUpper = ((null != caseOrderString)&&
caseOrderString.equals(Constants.ATTRVAL_CASEORDER_UPPER)) ?
true : false;
@@ -788,6 +809,9 @@
descending, langString,
caseOrderUpper,xslInstruction));
}
+
+ // Restore the variable stack.
+ vars.setCurrentStackFrameIndex(savedStackFrameIndex);
}
}
return keys;
@@ -836,9 +860,10 @@
SAXException
{
// Sort the nodes according to the xsl:sort method
- int tok = xslInstruction.getXSLToken();
+ // int tok = xslInstruction.getXSLToken();
Vector keys = processSortKeys(xslInstruction,
- tcontext, sourceNodeContext);
+ tcontext, sourceNodeContext,
+ selectStackFrameIndex);
// We can only do callbacks if the node list isn't sorted.
NodeCallback callback = (null == keys) ? this : null;
@@ -907,8 +932,17 @@
{
if(null != keys)
{
- NodeSorter sorter = new
NodeSorter(tcontext.getXMLProcessorLiaison());
- sorter.sort((NodeVector)sourceNodes, keys,
tcontext.getExecContext());
+ int savedCurrentStackFrameIndex
=tcontext.getVarStack().getCurrentStackFrameIndex();
+
tcontext.getVarStack().setCurrentStackFrameIndex(selectStackFrameIndex);
+ try
+ {
+ NodeSorter sorter = new
NodeSorter(tcontext.getXMLProcessorLiaison());
+ sorter.sort((NodeVector)sourceNodes, keys,
tcontext.getExecContext());
+ }
+ finally
+ {
+
tcontext.getVarStack().setCurrentStackFrameIndex(savedCurrentStackFrameIndex);
+ }
}
// NodeList children = sourceNodeContext.getChildNodes();
@@ -1342,7 +1376,7 @@
*/
public String getBaseIdentifier()
{
- return m_baseident;
+ return m_baseident.toExternalForm();
}
}