Один из возможных способов - создать функцию, которую можно использовать для добавления 1 к значению (если в значении присутствует число)
<xsl:function name="my:check">
<xsl:param name="current" />
<xsl:variable name="number" select="if (matches($current, '.*\d+')) then xs:int(replace($current, '[A-Z]+', '')) + 1 else ''" />
<xsl:value-of select="replace($current, '\d', ''), $number" separator="" />
</xsl:function>
Затем вы можете использовать xsl:for-each-group
для группировки элементов, начиная с тех, которые не являются последовательными с предыдущим значением
<xsl:for-each-group select="ReferenceDesignator" group-starting-with="ReferenceDesignator[. != my:check(preceding-sibling::ReferenceDesignator[1])]">
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="my">
<xsl:output method="text" />
<xsl:template match="ReferenceDesignators">
<xsl:for-each-group select="ReferenceDesignator" group-starting-with="ReferenceDesignator[. != my:check(preceding-sibling::ReferenceDesignator[1])]">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="current-group()[1], current-group()[position() > 1][last()]" separator="-" />
</xsl:for-each-group>
</xsl:template>
<xsl:function name="my:check">
<xsl:param name="current" />
<xsl:variable name="number" select="if (matches($current, '.*\d+')) then xs:int(replace($current, '[A-Z]+', '')) + 1 else ''" />
<xsl:value-of select="replace($current, '\d', ''), $number" separator="" />
</xsl:function>
</xsl:stylesheet>
Обратите внимание, что это делает предположение, что каждый ReferenceDesignator
состоит из одной или нескольких букв, за которыми следует ноль при большем числе цифр.