dbertoni    00/05/15 08:56:39

  Modified:    c/src/XSLT ElemValueOf.hpp ElemValueOf.cpp
  Log:
  Added optimization for "." select.
  
  Revision  Changes    Path
  1.5       +5 -0      xml-xalan/c/src/XSLT/ElemValueOf.hpp
  
  Index: ElemValueOf.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemValueOf.hpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ElemValueOf.hpp   2000/04/11 15:09:26     1.4
  +++ ElemValueOf.hpp   2000/05/15 15:56:38     1.5
  @@ -118,6 +118,11 @@
         * Tells if this element should disable escaping.
         */
        bool                    m_disableOutputEscaping;
  +
  +     /**
  +      * True if the select pattern is '.'
  +      */
  +     bool                    m_isDot;
   };
   
   
  
  
  
  1.6       +74 -32    xml-xalan/c/src/XSLT/ElemValueOf.cpp
  
  Index: ElemValueOf.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemValueOf.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ElemValueOf.cpp   2000/04/20 16:47:34     1.5
  +++ ElemValueOf.cpp   2000/05/15 15:56:38     1.6
  @@ -66,6 +66,7 @@
   
   
   
  +#include <XPath/XObjectFactory.hpp>
   #include <XPath/XPath.hpp>
   
   
  @@ -93,7 +94,8 @@
                                                columnNumber,
                                                Constants::ELEMNAME_VALUEOF),
        m_selectPattern(0),
  -     m_disableOutputEscaping(false)
  +     m_disableOutputEscaping(false),
  +     m_isDot(false)
   {
        const unsigned int      nAttrs = atts.getLength();
   
  @@ -107,8 +109,18 @@
                switch(tok)
                {
                case Constants::TATTRNAME_SELECT:
  -                     m_selectPattern = 
constructionContext.createXPath(atts.getValue(i), 
  -                                                                             
                                          *this);
  +                     {
  +                             const XalanDOMChar* const       avalue = 
atts.getValue(i);
  +                             assert(avalue != 0);
  +
  +                             if (avalue[0] == '.' && avalue[1] == 0)
  +                             {
  +                                     m_isDot = true;
  +                             }
  +
  +                             m_selectPattern = 
constructionContext.createXPath(avalue, 
  +                                                                             
                                                  *this);
  +                     }
                        break;
   
                case Constants::TATTRNAME_DISABLE_OUTPUT_ESCAPING:
  @@ -148,46 +160,76 @@
                        XalanNode*                                              
sourceTree,
                        XalanNode*                                              
sourceNode,
                        const QName&                                    mode) 
const
  -{    
  +{
        ElemTemplateElement::execute(executionContext, sourceTree, sourceNode, 
mode);
  -     
  -     const XObject* const    value =
  -             m_selectPattern->execute(sourceNode,
  -                                                              *this,
  -                                                              
executionContext);
  +
  +     XalanDOMString  theValue;
   
  -     if(0 != getStylesheet().getStylesheetRoot().getTraceListeners())
  +     if (m_isDot == true)
        {
  -             getStylesheet().getStylesheetRoot().fireSelectedEvent(
  -                     SelectionEvent(executionContext,
  -                                                sourceNode,
  -                                                *this,
  -                                                
XalanDOMString(XALAN_STATIC_UCODE_STRING("select")),
  -                                                *m_selectPattern,
  -                                                value));       
  -     }
  +             const XalanNode::NodeType       type = 
sourceNode->getNodeType();
  +
  +             if(type == XalanNode::COMMENT_NODE ||
  +           type == XalanNode::PROCESSING_INSTRUCTION_NODE)
  +             {
  +                     theValue = sourceNode->getNodeValue();
  +             }
  +             else
  +             {
  +                     theValue = executionContext.getNodeData(*sourceNode);
  +             }
   
  -     if(0 != value)
  +             if(0 != getStylesheet().getStylesheetRoot().getTraceListeners())
  +             {
  +                     getStylesheet().getStylesheetRoot().fireSelectedEvent(
  +                             SelectionEvent(executionContext,
  +                                                        sourceNode,
  +                                                        *this,
  +                                                        
XalanDOMString(XALAN_STATIC_UCODE_STRING("select")),
  +                                                        *m_selectPattern,
  +                                                        
executionContext.getXObjectFactory().createString(theValue)));       
  +             }
  +     }
  +     else
        {
  -             const int       type = value->getType();
  +             const XObject* const    value =
  +                     m_selectPattern->execute(sourceNode,
  +                                                                      *this,
  +                                                                      
executionContext);
   
  -             if (XObject::eTypeNull != type)
  +             if(0 != getStylesheet().getStylesheetRoot().getTraceListeners())
                {
  -                     const XalanDOMString    s = value->str();
  +                     getStylesheet().getStylesheetRoot().fireSelectedEvent(
  +                             SelectionEvent(executionContext,
  +                                                        sourceNode,
  +                                                        *this,
  +                                                        
XalanDOMString(XALAN_STATIC_UCODE_STRING("select")),
  +                                                        *m_selectPattern,
  +                                                        value));       
  +             }
   
  -                     const unsigned int              len = length(s);
  +             if(0 != value)
  +             {
  +                     const int       type = value->getType();
   
  -                     if(len > 0)
  +                     if (XObject::eTypeNull != type)
                        {
  -                             if(m_disableOutputEscaping == false)
  -                             {
  -                                     
executionContext.characters(toCharArray(s), 0, len);
  -                             }
  -                             else
  -                             {
  -                                     
executionContext.charactersRaw(toCharArray(s), 0, len);
  -                             }
  +                             theValue = value->str();
                        }
  +             }
  +     }
  +
  +     const unsigned int              len = length(theValue);
  +
  +     if(len > 0)
  +     {
  +             if(m_disableOutputEscaping == false)
  +             {
  +                     executionContext.characters(toCharArray(theValue), 0, 
len);
  +             }
  +             else
  +             {
  +                     executionContext.charactersRaw(toCharArray(theValue), 
0, len);
                }
        }
   }
  
  
  

Reply via email to