В функции @ MarcoS есть одна ошибка: вместо if ($in gt 16)
должно быть if ($in ge 16)
(больше или равно). Неверные шестнадцатеричные значения были сгенерированы, например, для числа 259.
Полная функция должна выглядеть следующим образом:
<xsl:function name="my:int-to-hex" as="xs:string">
<xsl:param name="in" as="xs:integer"/>
<xsl:sequence
select="if ($in eq 0)
then '0'
else
concat(if ($in ge 16)
then my:int-to-hex($in idiv 16)
else '',
substring('0123456789ABCDEF',
($in mod 16) + 1, 1))"/>
</xsl:function>