XSL - элемент keyПростое определение
Ключ может содержать элемент или множество элементов. Получить элемент или множество элементов из ключа можно при помощи функции key() по переданному в качестве аргумента значению.
Определение из учебникаЭлемент объявляет именованный ключ, т. е. пару «имя-значение», связанную с указанным элементом в XML-документе. Этот ключ используется с фукнцией key() в выражениях XPath для осуществления эффективного доступа к связанным элементам в сложном XML-документе.
ОригиналThe element is a top-level element which declares a named key that can be used in the style sheet with the key() function.
Ссылки на документацию
https://www.w3schools.com/xml/ref_xsl_el_key.asp
В примере выше создается ключ с именем group, который содержит множество item (match="item") и этот элемент "item" или его множество можно получить по значению атрибута group (use="@group").
В примере выше в ключе «group» содержится множество «item», доступ к которым можно получить по значению атрибута «group» через функцию «key()».
generate-idПростое определение
Возвращает строку, которая уникально идентифицирует первый узел документа. Если в функцию передать множество, то будет возращен уникальный id первого элемента из этого множества
Определение из учебникаФункция generate-id возвращает уникальный строковый идентификатор первого в порядке просмотра документа узла, передаваемого ей в виде аргумента. Если аргумент опущен, функция возвращает уникальный идентификатор контекстного узла. Если аргументом является пустое множество, функция должна возвращать пустую строку.
Функция generate-id возвращает для двух узлов один и тот же идентификатор тогда и только тогда, когда эти два узла совпадают. Это означает, что во время выполнения одного преобразования функция generate-id будет возвращать один идентификатор для одного и того же узла, а для разных узлов generate-id обязательно возвратит разные идентификаторы.
ОригиналThe generate-id() function returns a string value that uniquely identifies a specified node.
If the node-set specified is empty, an empty string is returned. If you omit the node-set parameter, it defaults to the current node.
Ссылки на документацию
https://xsltdev.ru/xpath/generate-id/
https://www.w3schools.com/xml/func_generateid.aspКвадратные скобкиПростое определение
Существует возможность ограничить количество элементов, отвечающих шаблону, введя фильтр — выражение, заключенное в квадратные скобки и следующее непосредственно за оператором пути.
Этой строчкой
<xsl:apply-templates select="item[generate-id(.) = generate-id(key('group',@group))]" />
мы говорим следующее:
Примени все шаблоны к тем элементам item, которые соответствуют критерии (фильтру), который указан в квадратных скобках
В этой части
key('group',@group)
мы говорим следующее:
Дайте мне множество элементов «item» из ключа «group», значение атрибута «group» которых равняется значению атрибута «group» у «item» находящегося в XML документе
Идем далее. Этой строчкой
generate-id(key('group',@group)
Мы говорим следующее
Вернув множество item с одинаковым значением атрибута «group», дай мне id первого элемента из множества
Этой строчкой
item[generate-id(.) = generate-id(key('group',@group))]
Мы говорим следующее
Примени все шаблоны для элементов «Item», generate-id которых равняется уникальному generate-id элемента.
В итоге получается, что шаблоны применятся только для элементов «item» с уникальным атрибутом «group»
Подробнее с примерами:
geekspace.info/notes/1