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();
     }
       
   }
  
  
  

Reply via email to