dbertoni    01/01/28 17:11:49

  Modified:    c/src/XSLT StylesheetHandler.cpp StylesheetHandler.hpp
  Log:
  Fix to ignore anything inside an extension element.
  
  Revision  Changes    Path
  1.53      +65 -13    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.52
  retrieving revision 1.53
  diff -u -r1.52 -r1.53
  --- StylesheetHandler.cpp     2001/01/25 17:09:36     1.52
  +++ StylesheetHandler.cpp     2001/01/29 01:11:49     1.53
  @@ -142,6 +142,7 @@
        m_foundStylesheet(false),
        m_foundNotImport(false),
        m_accumulateText(),
  +     m_inExtensionElementStack(),
        m_inLXSLTScript(false),
        m_LXSLTScriptBody(),
        m_LXSLTScriptLang(),
  @@ -215,6 +216,7 @@
   void StylesheetHandler::endDocument()
   {
        m_constructionContext.popLocatorStack();
  +     m_inExtensionElementStack.clear();
   
        if (m_exceptionPending == true)
        {
  @@ -274,6 +276,8 @@
        if (m_exceptionPending == true)
                return;
   
  +     m_inExtensionElementStack.push_back(false);
  +
        try
        {
   #if !defined(XALAN_NO_NAMESPACES)
  @@ -427,7 +431,7 @@
                                                }
                                        }
   
  -                                     if(!foundIt)
  +                                     if(!foundIt && inExtensionElement() == 
false)
                                        {
                                                XalanDOMString 
msg("(StylesheetHandler) " + XalanDOMString(name) +
                                                " requires a " + 
Constants::ATTRNAME_ELEMENTS + " attribute!");
  @@ -524,12 +528,13 @@
                                case Constants::ELEMNAME_COUNTERRESET:
                                case Constants::ELEMNAME_COUNTERSCOPE:
                                case Constants::ELEMNAME_APPLY_IMPORTS:
  -                             {
  -                                     XalanDOMString msg("(StylesheetHandler) 
" + XalanDOMString(name) + " not allowed inside a stylesheet!");
  +                                     if (inExtensionElement() == false)
  +                                     {
  +                                             XalanDOMString 
msg("(StylesheetHandler) " + XalanDOMString(name) + " not allowed inside a 
stylesheet!");
   
  -                                     throw SAXException(toCharArray(msg));
  -                             }
  -                             // break;
  +                                             throw 
SAXException(toCharArray(msg));
  +                                     }
  +                                     break;
   
                                case Constants::ELEMNAME_STYLESHEET:
                                {
  @@ -568,9 +573,10 @@
                                                                const 
XalanDOMString    prefix = tokenizer.nextToken();
                                                                // SANJIVA: ask 
Scott: is the line below correct?
   
  -                                                             const 
XalanDOMString extns = m_stylesheet.getNamespaceForPrefixFromStack(prefix);
  +                                                             const 
XalanDOMString&   extns = m_stylesheet.getNamespaceForPrefixFromStack(prefix);
   
                                                                
ExtensionNSHandler* const       nsh = new ExtensionNSHandler(extns);
  +
                                                                
m_stylesheet.addExtensionNamespace(extns, nsh);
                                                        }
                                                }
  @@ -615,11 +621,12 @@
                                break;
   
                                default:
  -                             {
  -                                     XalanDOMString msg("Unknown XSL 
element: " + localName);
  +                                     if (inExtensionElement() == false)
  +                                     {
  +                                             XalanDOMString msg("Unknown XSL 
element: " + localName);
   
  -                                     throw 
SAXException(c_wstr(TranscodeFromLocalCodePage("Unknown XSL element: ") + 
localName));
  -                             }
  +                                             throw 
SAXException(c_wstr(TranscodeFromLocalCodePage("Unknown XSL element: ") + 
localName));
  +                                     }
                                break;
   
                        }
  @@ -922,6 +929,10 @@
                                        nsh = new ExtensionNSHandler(extns);
   
                                        
m_stylesheet.addExtensionNamespace(extns, nsh);
  +
  +                                     
assert(m_inExtensionElementStack.empty() == false);
  +
  +                                     m_inExtensionElementStack.back() = true;
                                }
   
                                if (!isEmpty(elements)) 
  @@ -995,6 +1006,10 @@
                                                                                
        columnNumber,
                                                                                
        *nsh,
                                                                                
        localName);
  +
  +                                     
assert(m_inExtensionElementStack.empty() == false);
  +
  +                                     m_inExtensionElementStack.back() = true;
                                }
                                else 
                                {
  @@ -1076,7 +1091,7 @@
   
   
   ElemTemplateElement*
  -StylesheetHandler::initWrapperless (
  +StylesheetHandler::initWrapperless(
                        const XalanDOMChar*             name,
                        const AttributeList&    atts,
                        int                                             
lineNumber,
  @@ -1363,6 +1378,10 @@
                m_pLXSLTExtensionNSH = 0;
        }
        // END SANJIVA CODE
  +
  +     assert(m_inExtensionElementStack.empty() == false);
  +
  +     m_inExtensionElementStack.pop_back();
   }
   
   
  @@ -1590,6 +1609,36 @@
   
   
   
  +bool
  +StylesheetHandler::inExtensionElement() const
  +{
  +     if (m_inExtensionElementStack.size() == 0)
  +     {
  +             return false;
  +     }
  +     else
  +     {
  +             BoolStackType::const_reverse_iterator                   i = 
m_inExtensionElementStack.rbegin();
  +             const BoolStackType::const_reverse_iterator             theEnd 
= m_inExtensionElementStack.rend();
  +
  +             while(i != theEnd)
  +             {
  +                     if ((*i) == true)
  +                     {
  +                             return true;
  +                     }
  +                     else
  +                     {
  +                             ++i;
  +                     }
  +             }
  +
  +             return false;
  +     }
  +}
  +
  +
  +
   
StylesheetHandler::PushPopIncludeState::PushPopIncludeState(StylesheetHandler&  
     theHandler) :
        m_handler(theHandler),
        m_elemStack(theHandler.m_elemStack),
  @@ -1602,7 +1651,8 @@
        m_foundNotImport(theHandler.m_foundNotImport),
        m_namespaceDecls(),
        m_namespaces(),
  -     m_namespacesHandler()
  +     m_namespacesHandler(),
  +     m_inExtensionElementStack()
   {
        clear(m_handler.m_accumulateText);
        m_handler.m_elemStack.clear();
  @@ -1617,6 +1667,7 @@
        m_namespaceDecls.swap(theHandler.m_stylesheet.getNamespaceDecls());
        m_namespaces.swap(theHandler.m_stylesheet.getNamespaces());
        
m_namespacesHandler.swap(theHandler.m_stylesheet.getNamespacesHandler());
  +     m_inExtensionElementStack.swap(theHandler.m_inExtensionElementStack);
   }
   
   
  @@ -1648,4 +1699,5 @@
        m_handler.m_stylesheet.getNamespaceDecls().swap(m_namespaceDecls);
        m_handler.m_stylesheet.getNamespaces().swap(m_namespaces);
        m_handler.m_stylesheet.getNamespacesHandler().swap(m_namespacesHandler);
  +     m_handler.m_inExtensionElementStack.swap(m_inExtensionElementStack);
   }
  
  
  
  1.22      +11 -2     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.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- StylesheetHandler.hpp     2001/01/03 15:18:27     1.21
  +++ StylesheetHandler.hpp     2001/01/29 01:11:49     1.22
  @@ -108,10 +108,12 @@
        typedef vector<ElemTextLiteral*>                        
ElemTextLiteralStackType;
        typedef set<ElemTemplateElement*,
                                less<ElemTemplateElement*> >    
ElemTemplateSetType;
  +     typedef vector<bool>                                            
BoolStackType;
   #else
        typedef std::vector<ElemTemplateElement*>       ElemTemplateStackType;
        typedef std::vector<ElemTextLiteral*>           
ElemTextLiteralStackType;
        typedef std::set<ElemTemplateElement*>          ElemTemplateSetType;
  +     typedef std::vector<bool>                                       
BoolStackType;
   #endif
   
        /**
  @@ -421,6 +423,9 @@
        void
        processAccumulatedText();
   
  +     bool
  +     inExtensionElement() const;
  +
        // Data members...
        XalanDOMString  m_pendingException;
   
  @@ -429,7 +434,7 @@
        /**
         * The owning stylesheet.
         */
  -     Stylesheet& m_stylesheet;
  +     Stylesheet&             m_stylesheet;
   
        /**
         * The construction context.
  @@ -494,7 +499,9 @@
         * where possible.
         */
        XalanDOMString  m_accumulateText;
  -     
  +
  +     BoolStackType   m_inExtensionElementStack;
  +
        // BEGIN SANJIVA CODE
        bool m_inLXSLTScript;
        XalanDOMString m_LXSLTScriptBody;
  @@ -547,6 +554,8 @@
                Stylesheet::NamespacesStackType         m_namespaces;
   
                NamespacesHandler                                       
m_namespacesHandler;
  +
  +             BoolStackType                                           
m_inExtensionElementStack;
        };
   
        friend class PushPopIncludeState;
  
  
  

Reply via email to