Составные ключи группировки немного проще в XSLT 3 (последняя версия XSLT с лета 2017 года и поддерживается Saxon 9.8 или 9.9, а также Altova 2017 или 2018 или 2019), так как там вы можете использовать, например, for-each-group composite="yes" group-by="COUNTRY, COMPANY_NAME, MONTH_OF_BIRTH"
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output indent="yes"/>
<xsl:template match="EMPDTLS">
<xsl:copy>
<xsl:for-each-group select="EMP" composite="yes" group-by="COUNTRY, COMPANY_NAME, MONTH_OF_BIRTH">
<EmpGrp>
<xsl:copy-of select="current-group()"/>
</EmpGrp>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Вы можете проверить это онлайн на https://xsltfiddle.liberty -development.net / jyRYYhU / 1 .
Что касается XSLT 2, см. https://cranesoftwrights.github.io/books/ptux/index.htm для тщательной обработки XSLT, если у вас нет другого доступного учебника, или также смотрите спецификацию https://www.w3.org/TR/xslt20/#grouping-examples, в которой имеется «Составной ключ группировки»."как второй пример, вложив for-each-group
.Другой метод в XSLT 2 - объединить различные элементы, составляющие ключ группировки, в строку, например, group-by="string-join((COUNTRY, COMPANY_NAME, MONTH_OF_BIRTH), '|')"
, убедившись, что символ разделителя (например, |
) не содержится ни в одном значении элемента ключа.