virtual bool doEvaluate(const DOM::Node<std::string>& context,
			  const Arabica::XPath::ExecutionContext<std::string>& executionContext) const
  {
    const std::string functionName = baseT::argAsString(0, context, executionContext);
    const XML::QualifiedName<std::string> expandedName = XML::QualifiedName<std::string>::parseQName(functionName, true, namespaces_);

    if((expandedName.namespaceUri() != StylesheetConstant::NamespaceURI()) &&
       (!expandedName.namespaceUri().empty()))
      return false;

    static const char* XSLTNames[] = { "apply-imports", "apply-templates", "attributes", 
				       "call-template", "choose", "comment", "copy", 
				       "copy-of", "element", "fallback", "for-each", 
				       "if", "message", "number", "processing-instruction",
				       "text", "value-of", "variable", 0 };

    for(int i = 0; XSLTNames[i] != 0; ++i)
      if(expandedName.localName() == XSLTNames[i])
	return true;
    
    return false;
  } // doEvaluate
  virtual bool doEvaluate(const DOM::Node<std::string>& context,
			  const Arabica::XPath::ExecutionContext<std::string>& executionContext) const
  {
    const std::string functionName = baseT::argAsString(0, context, executionContext);
    const XML::QualifiedName<std::string> expandedName = XML::QualifiedName<std::string>::parseQName(functionName, true, namespaces_);

    const std::pair<std::string, std::string> name_to_check = std::make_pair(expandedName.namespaceUri(), expandedName.localName());

    return (std::find(functionNames_.begin(), functionNames_.end(), name_to_check) != functionNames_.end());
  } // doEvaluate
 static QName create(const XML::QualifiedName<std::string>& qName)
 {
   if(qName.prefix().length() && qName.namespaceUri().empty())
     throw SAX::SAXException("Prefix " + qName.prefix() + " is not declared.");
   return QName(qName.prefix(), qName.localName(), qName.namespaceUri());
 } // create