XSL select distinct elements

Published: Sunday, 28 October 2007

After upgrading to XSLT 2.0 and Saxon 8, I discovered that the saxon:distinct function was removed.

The variable $languages looks like:

<language>English</language>
<language>Chinese</language>
<language>English</language>
<language>French</language>
<language>French</language>

It contains 5 language elements, but we only want to process the 3 distinct languages.

In the past, I used the saxon:distinct function, specific to Saxon. Other XSL processors have their own functions.

<xsl:for-each select="saxon:distinct($languages/language)">
  language found: <xsl:value-of select="."/>
</xsl:for-each>

For XSLT 2.0, the above can be replaced with:

<xsl:for-each select="distinct-values($languages/lang)">
  <xsl:value-of select="."/>
</xsl:for-each>