ng-click is not providing alert. When the inner template of the directive is clicked alert box is not shown.
The fiddle link is here: http://jsfiddle.net/NNDhX/
Your directive has its own isolated scope. So function 'hi' should be inside directive's scope. If you want to pass your controller's function you should do binding, like scope: { ..., hi: '&' } and then <you-directive hi='hi' ..>. Here is a link to documentation about this: Understanding Transclusion and Scopes.
So just adding it in linking function is enough:
link: function(scope, element, attrs) {
scope.hi = function() { alert("hi"); }
Here is updated fiddle: http://jsfiddle.net/GwBAh/
I don't know if this is the best way but you can use $parent in directive to access parent scope.
<a ng-click="$parent.hi();">parent</a>
Here is link to full fiddle example: http://jsfiddle.net/EKDse/
The whole idea of isolate scopes is exactly to avoid 'sharing' things between parent<->child scopes, somehow protecting them from being exposed and (unintentionally) changed by other directives/controllers.
If you really want to avoid the isolate scope and share the parent's scope, try this:
Start by removing the directive's scope definition (commented below):
transclude: true,
/*scope: { title:'@zippyTitle' },*/
Then place the attributes (attrs) from the directive element on the directives' scope:
scope.attrs = attrs;
Note: By doing this the attrs property will also be available on the parent (Ctrl3) scope.
And finally define the title based on the scope.attrs
template: '<div>' +
'<div class="title">{{attrs.zippyTitle}}</div>' +
'<div class="body" ng-transclude></div>' +
'<a ng-click="hi();">hi</a>' +
'</div>',
jsFiddle: http://jsfiddle.net/NNDhX/1/