dbertoni    00/04/13 09:49:01

  Modified:    c/src/XSLT StylesheetHandler.cpp StylesheetHandler.hpp
  Log:
  Fixed handling of ElemTextLiteral.
  
  Revision  Changes    Path
  1.18      +32 -14    xml-xalan/c/src/XSLT/StylesheetHandler.cpp
  
  Index: StylesheetHandler.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.cpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- StylesheetHandler.cpp     2000/04/13 16:11:01     1.17
  +++ StylesheetHandler.cpp     2000/04/13 16:49:00     1.18
  @@ -118,12 +118,15 @@
                        Stylesheet&                                             
stylesheetTree,
                        StylesheetConstructionContext&  constructionContext) :
        FormatterListener(),
  +     m_includeBase(stylesheetTree.getBaseIdentifier()),
        m_pendingException(),
        m_exceptionPending(false),
        m_processor(processor),
        m_stylesheet(stylesheetTree),
        m_constructionContext(constructionContext),
  -     m_includeBase(stylesheetTree.getBaseIdentifier()),
  +     m_elemStack(),
  +     m_strayElements(),
  +     m_whiteSpaceElems(),
        m_pTemplate(0),
        m_lastPopped(0),
        m_inTemplate(false),
  @@ -133,8 +136,7 @@
        m_LXSLTScriptBody(),
        m_LXSLTScriptLang(),
        m_LXSLTScriptSrcURL(),
  -     m_pLXSLTExtensionNSH(0),
  -     m_elemStack()
  +     m_pLXSLTExtensionNSH(0)
   {
   }
   
  @@ -155,6 +157,11 @@
        for_each(m_whiteSpaceElems.begin(),
                         m_whiteSpaceElems.end(),
                         DeleteFunctor<ElemTemplateElement>());
  +
  +     // Clean up the stray elements.
  +     for_each(m_strayElements.begin(),
  +                      m_strayElements.end(),
  +                      DeleteFunctor<ElemTemplateElement>());
   }
   
   
  @@ -1170,7 +1177,6 @@
                        
                        PushPopIncludeState             theStateHandler(*this);
   
  -                     m_lastPopped = 0;
                        const XalanDOMString    href = atts.getValue(i);
   
                        assert(m_stylesheet.getIncludeStack().back() != 0);
  @@ -1186,9 +1192,8 @@
                        m_stylesheet.getIncludeStack().push_back(hrefUrl);
   
                        m_processor.parseXML(*hrefUrl, this, &m_stylesheet);
  -                     
  -                     m_stylesheet.getIncludeStack().pop_back();
   
  +                     m_stylesheet.getIncludeStack().pop_back();
                }
                else if(!isAttrOK(aname, atts, i))
                {
  @@ -1242,8 +1247,9 @@
        else if (tok == Constants::ELEMNAME_UNDEFINED ||
                tok == Constants::ELEMNAME_TEXT)
        {
  -             // These are stray elements, so delete them...
  -             delete m_lastPopped;
  +             // These are stray elements, so stuff them away
  +             // to be deleted when we're finished...
  +             m_strayElements.push_back(m_lastPopped);
        }
   
        // BEGIN SANJIVA CODE
  @@ -1304,7 +1310,7 @@
                        m_stylesheet,
                        lineNumber, columnNumber,
                        chars, 0, length, 
  -                     true, preserveSpace, 
  +                     false, preserveSpace, 
                        disableOutputEscaping);
   
                const bool isWhite = isWhiteSpace(chars, 0, length);
  @@ -1330,10 +1336,9 @@
   
                        if(0 != last)
                        {
  -                             ElemTemplateElement* lastElem = 
dynamic_cast<ElemTemplateElement*>(last);
                                // If it was surrounded by xsl:text, it will 
count as an element.
                                bool isPrevCharData =
  -                                     Constants::ELEMNAME_TEXTLITERALRESULT 
== lastElem->getXSLToken();
  +                                     Constants::ELEMNAME_TEXTLITERALRESULT 
== last->getXSLToken();
                                bool isLastPoppedXSLText = (m_lastPopped != 0) 
&&
                                        (Constants::ELEMNAME_TEXT == 
m_lastPopped->getXSLToken());
   
  @@ -1357,9 +1362,12 @@
        }
        // END SANJIVA CODE
        // TODO: Flag error if text inside of stylesheet
  +
  +//   m_lastPopped = 0;
   }
   
   
  +
   void StylesheetHandler::cdata(const XMLCh* const chars, const unsigned int 
length)
   {
        // if we have apending exception, we don't want to even try to process 
this
  @@ -1413,10 +1421,16 @@
   
                        if(0 != last)
                        {
  -                             if(Constants::ELEMNAME_TEXTLITERALRESULT == 
last->getXSLToken() &&
  -                                     
static_cast<ElemTextLiteral*>(last)->isPreserveSpace() == false)
  +                             // If it was surrounded by xsl:text, it will 
count as an element.
  +                             bool isPrevCharData =
  +                                     Constants::ELEMNAME_TEXTLITERALRESULT 
== last->getXSLToken();
  +                             bool isLastPoppedXSLText = (m_lastPopped != 0) 
&&
  +                                             (Constants::ELEMNAME_TEXT == 
m_lastPopped->getXSLToken());
  +
  +                             if(isPrevCharData && ! isLastPoppedXSLText)
                                {
                                        parent->appendChildElem(elem);
  +
                                        shouldPush = false;
                                }
                        }
  @@ -1432,6 +1446,8 @@
        }
        // END SANJIVA CODE
        // TODO: Flag error if text inside of stylesheet
  +
  +     m_lastPopped = 0;
   }
   
   
  @@ -1442,6 +1458,8 @@
                return;
   
     // Ignore!
  +
  +     m_lastPopped = 0;
   }
   
   
  @@ -1451,7 +1469,7 @@
        if (m_exceptionPending == true)
                return;
   
  -  // No action for the moment.
  +     m_lastPopped = 0;
   }
   
   
  
  
  
  1.11      +5 -0      xml-xalan/c/src/XSLT/StylesheetHandler.hpp
  
  Index: StylesheetHandler.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- StylesheetHandler.hpp     2000/04/12 19:41:02     1.10
  +++ StylesheetHandler.hpp     2000/04/13 16:49:00     1.11
  @@ -424,6 +424,11 @@
        ElemTemplateStackType   m_elemStack;
   
        /**
  +      * The stack of stray elements, to be delete when finished.
  +      */
  +     ElemTemplateStackType   m_strayElements;
  +
  +     /**
         * Need to keep a stack of found whitespace elements so that 
         * whitespace elements next to non-whitespace elements can 
         * be merged.  For instance: &lt;out> &lt;![CDATA[test]]> &lt;/out>
  
  
  

Reply via email to