Предполагая, что каждый дубликат увеличивается на 1 каждый раз (так что первый дубликат равен 4, а затем следующие 5), одним из способов может быть использование рекурсивного шаблона, который обрабатывает каждый элемент по очереди и увеличивает параметркогда он находит дубликат).
Чтобы найти дубликаты, я вернулся к использованию мюнхенской группировки, которая обычно используется в XSLT 1.0
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="invoices" match="DettaglioLinee" use="NumeroLinea" />
<xsl:variable name="max" select="max(/DatiBeniServizi/DettaglioLinee/NumeroLinea)" />
<xsl:template match="DatiBeniServizi">
<Invoice>
<xsl:apply-templates select="DettaglioLinee[1]" />
</Invoice>
</xsl:template>
<xsl:template match="DettaglioLinee">
<xsl:param name="incr" select="1" />
<xsl:variable name="isDistinct" select="generate-id() = generate-id(key('invoices', NumeroLinea)[1])" />
<InvoiceDetail>
<InvoiceLineNumber>
<xsl:value-of select="if ($isDistinct) then NumeroLinea else $max + $incr" />
</InvoiceLineNumber>
</InvoiceDetail>
<xsl:apply-templates select="following-sibling::*[1]">
<xsl:with-param name="incr" select="if ($isDistinct) then $incr else $incr + 1" />
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
Если дубликаты всегда были последовательными(т.е. у вас не будет, например, 1, 2, 1), вы удалите использование ключа и определите переменную isDistinct
следующим образом:
<xsl:variable name="isDistinct" select="not(NumeroLinea = preceding-sibling::*[1]/NumeroLinea)" />
РЕДАКТИРОВАТЬ: Если вы не беспокоитесь о последовательных числах (например, у вас может быть 1, 5, 2, 3), то вы просто добавляете позицию дубликатов к максимальному значению, что позволит избежать дубликатов
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="invoices" match="DettaglioLinee" use="NumeroLinea" />
<xsl:variable name="max" select="max(/DatiBeniServizi/DettaglioLinee/NumeroLinea)" />
<xsl:template match="DatiBeniServizi">
<Invoice>
<xsl:apply-templates select="DettaglioLinee" />
</Invoice>
</xsl:template>
<xsl:template match="DettaglioLinee">
<xsl:variable name="isDistinct" select="generate-id() = generate-id(key('invoices', NumeroLinea)[1])" />
<InvoiceDetail>
<InvoiceLineNumber>
<xsl:value-of select="if ($isDistinct) then NumeroLinea else $max + position()" />
</InvoiceLineNumber>
</InvoiceDetail>
</xsl:template>
</xsl:stylesheet>