Один из вариантов - использовать xsl:for-each-group
и использовать string-join
на элементах, которые вы хотите сформировать ключом группировки
<xsl:for-each-group select="wd:Report_Entry/wd:LINE"
group-by="string-join((../wd:BU, ../wd:JDATE, ../wd:DESCR, wd:MEMO, wd:CURRENCY, wd:ACCOUNT), '|')">
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wd="urn:com.report/RPT"
xmlns:this="urn:this-stylesheet"
version="2.0">
<xsl:output method="text"/>
<xsl:template match="wd:Report_Data">
<xsl:for-each-group select="wd:Report_Entry/wd:LINE"
group-by="string-join((../wd:BU, ../wd:JDATE, ../wd:DESCR, wd:MEMO, wd:CURRENCY, wd:ACCOUNT), '|')">
<xsl:value-of select="../wd:BU"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="../wd:JDATE"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="normalize-space(substring(replace(../wd:DESCR,'~',''),1,400))"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="wd:ACCOUNT"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="normalize-space(substring(replace(wd:MEMO,'~',''),1,400))"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="wd:AMT"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="wd:CURRENCY"/>
<xsl:call-template name="insertNewLine"/>
</xsl:for-each-group>
</xsl:template>
<xsl:template name="insertNewLine">
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
ФактическиВы могли бы сократить шаблон до этого за счет читабельности:
<xsl:template match="wd:Report_Data">
<xsl:for-each-group select="wd:Report_Entry/wd:LINE"
group-by="string-join((../wd:BU, ../wd:JDATE, normalize-space(substring(replace(../wd:DESCR,'~',''),1,400)), normalize-space(substring(replace(wd:MEMO,'~',''),1,400)), wd:CURRENCY, wd:ACCOUNT), '|')">
<xsl:value-of select="current-grouping-key()"/>
<xsl:call-template name="insertNewLine"/>
</xsl:for-each-group>
</xsl:template>
Или, если вы действительно этого хотите, сделайте это ...
<xsl:template match="wd:Report_Data">
<xsl:value-of select="distinct-values(wd:Report_Entry/wd:LINE/string-join((../wd:BU, ../wd:JDATE, normalize-space(substring(replace(../wd:DESCR,'~',''),1,400)), normalize-space(substring(replace(wd:MEMO,'~',''),1,400)), wd:CURRENCY, wd:ACCOUNT), '|'))" separator=" " />
</xsl:template>