mmidy       00/04/07 12:17:31

  Modified:    src/org/apache/xalan/xslt ElemSort.java
                        ElemTemplateElement.java
  Log:
  Make the correct variable stack frame index is used. This fixes a problem 
with sort and variable scope. Also fix problem with using attribute value 
templates
  
  Revision  Changes    Path
  1.7       +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.7
  diff -u -r1.6 -r1.7
  --- ElemSort.java     2000/03/02 10:23:03     1.6
  +++ ElemSort.java     2000/04/07 19:17:31     1.7
  @@ -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.31      +38 -4     
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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- ElemTemplateElement.java  2000/03/29 03:51:57     1.30
  +++ ElemTemplateElement.java  2000/04/07 19:17:31     1.31
  @@ -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;
  @@ -838,7 +862,8 @@
       // Sort the nodes according to the xsl:sort method
       // 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(); 
  
  
  

Reply via email to