code: public XObject execute(XPathContext xctxt)
            throws javax.xml.transform.TransformerException
    {
      if (xctxt.isSecureProcessing())
        throw new javax.xml.transform.TransformerException(
          XPATHMessages.createXPATHMessage(
            XPATHErrorResources.ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED,
            new Object[] {toString()}));
        
      XObject result;
      Vector argVec = new Vector();
      int nArgs = m_argVec.size();
  
      for (int i = 0; i < nArgs; i++)
      {
        Expression arg = (Expression) m_argVec.elementAt(i);
        
        XObject xobj = arg.execute(xctxt);
        /*
         * Should cache the arguments for func:function
         */
        xobj.allowDetachToRelease(false); 
        argVec.addElement(xobj);
      }
      //dml
      ExtensionsProvider extProvider = (ExtensionsProvider)xctxt.getOwnerObject();
      Object val = extProvider.extFunction(this, argVec);
  
      if (null != val)
      {
        result = XObject.create(val, xctxt);
      }
      else
      {
        result = new XNull();
      }
  
      return result;
    }
docs: Execute the function.  The function must return
  a valid object.
  @param xctxt The current execution context.
  @return A valid XObject.
  
  @throws javax.xml.transform.TransformerException