dbertoni    2002/10/30 23:10:26

  Modified:    c/src/XalanExtensions FunctionEvaluate.cpp
  Log:
  Factored out common code.
  
  Revision  Changes    Path
  1.7       +70 -41    xml-xalan/c/src/XalanExtensions/FunctionEvaluate.cpp
  
  Index: FunctionEvaluate.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XalanExtensions/FunctionEvaluate.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FunctionEvaluate.cpp      17 Apr 2002 05:34:20 -0000      1.6
  +++ FunctionEvaluate.cpp      31 Oct 2002 07:10:25 -0000      1.7
  @@ -62,6 +62,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include <XalanDOM/XalanElement.hpp>
   
   
  @@ -69,6 +73,7 @@
   #include <XPath/ElementPrefixResolverProxy.hpp>
   #include <XPath/XObjectFactory.hpp>
   #include <XPath/XPath.hpp>
  +#include <XPath/XPathConstructionContextDefault.hpp>
   #include <XPath/XPathProcessorImpl.hpp>
   
   
  @@ -85,6 +90,52 @@
   
   
   
  +inline XObjectPtr
  +doExecute(
  +                     XPathExecutionContext&  executionContext,
  +                     XalanNode*                              context,
  +                     const XalanDOMString&   expression,
  +                     const PrefixResolver&   resolver)
  +{
  +     // $$$ ToDo: Consider moving all of this into a member function of
  +     // XPathExecutionContext.
  +     XPathProcessorImpl                                      theProcessor;
  +
  +     XPathConstructionContextDefault         theConstructionContext;
  +
  +     XPath                                                           
theXPath;
  +
  +     theProcessor.initXPath(
  +                     theXPath,
  +                     theConstructionContext,
  +                     expression,
  +                     resolver);
  +
  +     return theXPath.execute(context, resolver, executionContext);
  +}
  +
  +
  +
  +inline XObjectPtr
  +doExecute(
  +                     XPathExecutionContext&  executionContext,
  +                     XalanNode*                              context,
  +                     const XalanDOMString&   expression,
  +                     const XalanNode*                resolver)
  +{
  +     assert(resolver == 0 || resolver->getNodeType() == 
XalanNode::ELEMENT_NODE);
  +
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +     ElementPrefixResolverProxy      theProxy((const XalanElement*)resolver);
  +#else
  +     ElementPrefixResolverProxy      theProxy(static_cast<const 
XalanElement*>(resolver));
  +#endif
  +
  +     return doExecute(executionContext, context, expression, theProxy);
  +}
  +
  +
  +
   XObjectPtr
   FunctionEvaluate::execute(
                        XPathExecutionContext&                  
executionContext,
  @@ -99,57 +150,35 @@
   
        assert(args[0].null() == false);
   
  +     const XalanDOMString&   theExpression = args[0]->str();
  +
        const PrefixResolver* const     theResolver =
                executionContext.getPrefixResolver();
   
  -     if (theResolver == 0)
  +     if (theResolver != 0)
        {
  -             if (context->getNodeType() != XalanNode::ELEMENT_NODE)
  -             {
  -                     executionContext.warn(
  -                             "No prefix resolver is available in evaluate(). 
 The expression cannot be evaluated.",
  -                             context,
  -                             locator);
  -
  -                     return args[0];
  -             }
  -             else
  -             {
  -                     executionContext.warn(
  -                             "No prefix resolver is available in evaluate(). 
 evalute() will use the context node for prefix resolution.",
  -                             context,
  -                             locator);
  -
  -#if defined(XALAN_OLD_STYLE_CASTS)
  -                     ElementPrefixResolverProxy      theProxy((const 
XalanElement*)context);
  -#else
  -                     ElementPrefixResolverProxy      
theProxy(static_cast<const XalanElement*>(context));
  -#endif
  -
  -                     XPathProcessorImpl      theProcessor;
  -
  -                     XPath                           theXPath;
  -
  -                     theProcessor.initXPath(
  -                                     theXPath,
  -                                     args[0]->str(),
  -                                     theProxy);
  -
  -                     return theXPath.execute(context, *theResolver, 
executionContext);
  -             }
  +             return doExecute(executionContext, context, theExpression, 
*theResolver);
        }
        else
        {
  -             XPathProcessorImpl      theProcessor;
  +             const XalanNode*        resolverNode = context;
  +
  +             if (resolverNode->getNodeType() != XalanNode::ELEMENT_NODE)
  +             {
  +                     resolverNode = 
DOMServices::getParentOfNode(*resolverNode);
   
  -             XPath                           theXPath;
  +                     if (context->getNodeType() != XalanNode::ELEMENT_NODE)
  +                     {
  +                             executionContext.warn(
  +                                     "No prefix resolver is available in 
evaluate().",
  +                                     context,
  +                                     locator);
   
  -             theProcessor.initXPath(
  -                             theXPath,
  -                             args[0]->str(),
  -                             *theResolver);
  +                             resolverNode = 0;
  +                     }
  +             }
   
  -             return theXPath.execute(context, *theResolver, 
executionContext);
  +             return doExecute(executionContext, context, theExpression, 
resolverNode);
        }
   }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to