EMACS has an etags.el package that supports use of etags, the EMACS version of ctags. It tags your source code so you can jump directly to the source for a function, variable, or other symbol. I’ve been using it heavily with C++ and C# (though for C++, I’ve supplanted it with GNU Global, and there is an EMACS package for that too, ggtags).
I wanted the same functionality for xslt, which I use heavily at work. Luckily exuberant-ctags and etags both provide support for extending support to other languages, by supplying regular expressions.
I put the following regular expressions in ~/.ctags:
--langdef=xslt --langmap=xslt:.xsl --regex-xslt=/<xsl:template name="([^"]*)"/1/ --regex-xslt=/<xsl:template match="[^"]*"[ \t\n]+mode="([^"]*)"/1/ --regex-xslt=/<xsl:variable name="([^"]+)"/1/
… and generate the TAGS file
ctags -e -o TAGS *.xsl
I can now jump to the definition of any variable or template in my xsl files!