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