Caveat: While I have seen a few presentations on XSLT 3.0, I have never actually written a working XSLT 3.0 program. (Or at least, not working the way I want it to. :-) Some of the advantages of XSLT 3.0: 1) xml-to-json() and json-to-xml() 2) You can use the || operator instead of concat(). 3) text templates (i.e., you can insert XPath into text by enclosing it in curly braces. E.g. <span class="label">[{ normalize-space(.)||'-'||position() }]</span> This feature is turned on or off by @expand-text on the root element). 4) The bang operator (which *is* the map operator) allows XPaths to contain functions, as it were. It says "for each item on my left, perform the thing on my right, and append the result to the output I'm bulding" or something like that, at least. 5) Function chaining is done with the arrow operator. So the following (taken from odd2relax) | distinct-values( tokenize( normalize-space($exclude), '\s+') ) could be written as | normalize-space($exclude) => tokenize('\s+') => distinct-values() which is to some folks much easier to read. 6) Functions can be created anonymously, and refered to in a variable. (This is *very* powerful, but a bit confusing.) 7) Special handling of the last item of the sequence can be done more naturally using xsl:iterate and xsl:on-completion rather than xsl:for-each and a conditional test to see if you're on the last item or not. There are *lots* of other improvements that I don't understand (or, in rare cases, do understand but don't care about, e.g. streaming). Probably a good place to read up on this stuff is our own David Birnbaum's take on it: http://dh.obdurodon.org/xslt3.xhtml