Last weekend, I delivered a session on BizTalk Server 2020 in action at the Global Integration Bootcamp 2020 in Madrid. During that session, I covered the new features available in the latest version of the product.
With this post, I start a new blog series about what’s new in BizTalk Server 2020. I begin with one of the most expected and long‑requested features: XSLT 3.0 support.
XSLT 3.0 represents a major upgrade over XSLT 1.0 and XSLT 2.0. It evolves XSLT into a general‑purpose transformation language for modern data storage and messaging formats.
📝 One-Minute Brief
Introduces XSLT 3.0 support in BizTalk Server 2020, explaining why it is a major upgrade over XSLT 1.0 and 2.0 and how BizTalk now enables modern XSLT processing through Saxon 9 HE and custom transform engines.
Key advantages of XSLT 3.0
XSLT 3.0 offers many advantages over XSLT 1.0 and XSLT 2.0. Rather than covering every improvement, this section highlights the most important ones for BizTalk Server scenarios.
Extended function set, sequences, arrays, and maps
XSLT 1.0 shared the same function set as XPath 1.0, which severely limited its capabilities. It offered minimal math support, no regular expressions, and very limited string manipulation. It also lacked support for sequences, set operations, and date handling.
XSLT 3.0 removes these limitations by introducing:
- A richer function set
- Native support for sequences, arrays, and maps
- Improved data manipulation and transformation flexibility
Grouping capabilities
XSLT 3.0 significantly improves grouping through xsl:for-each-group.
With this instruction, you can:
- Select items based on specific criteria
- Group elements with common values
- Process each group independently
XSLT also provides helper XPath functions such as:
current-grouping-key()current-group()
Grouping variants
XSLT 3.0 supports multiple grouping strategies:
group-adjacent: groups adjacent items that share the same keygroup-starting-with: starts a new group when an item matches a patterngroup-by: creates groups based on a shared key value
Sorting improvements
XSLT 3.0 enhances sorting using xsl:sort. You can use it inside:
<xsl:for-each><xsl:for-each-group><xsl:apply-templates><xsl:perform-sort>
This instruction defines how and in which order XSLT processes data. You can also define multiple sort keys to support complex sorting rules.
BizTalk XSLT transform engine limitations
By default, BizTalk uses the .NET Framework XSLT transformation engine. As a result, this engine supports only XSLT 1.0, which limits the use of more modern XSLT features.
XSLT engine options in BizTalk Server 2020
Starting with BizTalk Server 2020, users can now choose Saxon:registered: 9 (Saxon 9 HE) as the XSLT transformation engine. More importantly, BizTalk also allows you to plug in a custom XSLT transform engine, offering much greater flexibility.
- You can implement a custom XSLT transform engine by defining an XSLT transform implementation derived from the abstract class Microsoft.XLANGs.BaseTypes.ITransform2 in assembly Microsoft.XLANGs.BaseTypes.dll.
- See more details at: Custom XSLT transform implementation.
This makes it possible for BizTalk server maps to support newer versions of XSLT. Using Saxon 9 HE, we can readily use XSLT 3.0.
Use the XSLT Transform Engine property to specify the XSLT transform engine you wish to use:

This was one of the most expected features, but be careful, this can be a poisoned gift because Saxon 9 HE doesn’t support embedded scripting. As a result, functoids shipped as part of BizTalk may not function well. And in many cases, this can be a showstopper.
The advantages of using XSLT 3.0 with Saxon 9 HE:
- Development: The XSLT file can be developed separately and hosted in a BizTalk map. It will simplify specific scenarios, especially scenarios where grouping and sorting are required. As we mentioned above, XSLT 3.0 provides an extended set of functions, which was very limited within XSLT 1.0.
Disadvantages when using XSLT 3.0 with Saxon 9 HD:
- Level of effort: Not quite as intuitive, Functoids are easier to read visually on the map grid and therefore require “geeky” coding skills.
- Overview: You lose the visual map representation. You can conjugate Saxon 9 HE with the BizTalk Mapper, but it is harder to do so.
- BizTalk Mapper Editor limitations: except for a few built-in Functoids like Scripting Functoid (not all script types will work properly) or advanced Functoids, BizTalk Functoids will not work while using the Saxon 9 HE XSLT Transformation Engine.
- BizTalk Development Tool Integration: it is a brand new feature, and it seems that it doesn’t have, at least for now, the same level of integration capabilities with the BizTalk Server development tools that we are used to having and using if we compare with the default transformation engine

Hope you find this helpful! If you liked the content or found it useful and would like to support me in writing more, consider buying (or helping to buy) a Star Wars Lego set for my son.
Does BizTalk 2020 actually ship with the Saxon 9 HE XSLT transformation engine, or must it be purchased separately from Saxon? The BizTalk documentation is a bit sparse regarding exactly how to obtain and install this alternative transformation engine.
As far as I know, and I can see in the product, it is shipped with the Saxon 9 HE XSLT transformation engine.