If org-contacts-template-name returns the template name ("John Doe" in your example), then you should be able to do something like this:
... :NOTE: [[file:~/myotherfolder/%(munge (org-contacts-template-name)).org][%(org-contacts-template-name) Card]] ...
where munge is a function that takes the template name and returns the basename of the file ("johndoe" in your example), e.g. by converting it to lower case and deleting whitespace:
(defun munge (tname) (downcase (replace-regexp-in-string "[[:space:]]+" "" tname)))
Tested only in simulation: I don't have org-contacts installed.
EDIT: here's a quick and dirty way to get the name interactively once and then use it later for the other cases:
(defvar org-contacts-template-name nil) (defun munge (tname) (downcase (replace-regexp-in-string "[[:space:]]+" "" tname))) (defun my-org-contacts-template-name (&optional arg) (if arg arg (setq org-contacts-template-name (read-from-minibuffer "Name: " nil)))) (setq org-capture-templates '(("c" "Networking Contacts" entry (file+headline "~/tmp/org/contacts.org" "Networking") "* %(my-org-contacts-template-name) :PROPERTIES: :PHONE: :EMAIL: %(org-contacts-template-email) :COMPANY: [[file:~/tmp/org/companies.org::][C]] :NOTE: [[file:~/tmp/org/%(munge (my-org-contacts-template-name org-contacts-template-name)).org][%(my-org-contacts-template-name org-contacts-template-name) Card]] :END:")))
Basically, we define a (dynamically scoped, global) variable org-contacts-template-name, and we use a different function to ask the user to enter a value which is saved in that global variable. The function is called again, but now with a non-nil argument (the value of the previously-set global variable, which is just returned in that case) in the other instances of the template. This is probably quite delicate and fragile (e.g. it assumes that the capture template is processed top-to-bottom, which seems to be the case today, but there are no guarantees; there is also no error handling at all), but it does seem to work. Extending it to more inputs is left as an exercise. I would recommend the Introduction to Emacs Lisp: if you are going to hack Emacs Lisp, then you need to learn some :-)