xsl:for-each-group¶
Выбирает последовательность узлов и/или атомарных значений и организует их в подмножества, называемые группами.
Доступен в XSLT 2.0 и более поздних версиях. Доступен во всех изданиях Saxon.
- Категория: инструкция
- Содержимое: (
xsl:sort
* , sequence-constructor ) - Допустимые родительские элементы: любой элемент XSLT, модель содержимого которого - sequence-constructor; любой литеральный элемент результата
Атрибуты¶
select
- expression
- Выражение для выбора узлов/значений.
group-by?
- expression
- Объединяет все элементы, имеющие одинаковое значение для ключа группировки. Ключ группировки может иметь несколько значений (последовательность значений), в этом случае элемент добавляется в более чем одну группу.
group-adjacent?
- expression
- Группирует вместе все элементы, имеющие одинаковое значение для ключа группировки, при условии, что они также являются соседними во входной последовательности. Это полезно, когда необходимо обернуть новый элемент вокруг последовательности связанных элементов в исходных документах, например, последовательности элементов
<bullet>
. В этом случае ключ группировки должен быть однозначным. group-starting-with?
- pattern
- Обрабатывает элементы в заданной последовательности по очереди, начиная новую группу каждый раз, когда один из элементов соответствует заданному шаблону. Это полезно, например, при сопоставлении элемента
<h2>
и следующих за ним элементов<p>
. group-ending-with?
- pattern
- Обрабатывает элементы в заданной последовательности по очереди, закрывая текущую группу всякий раз, когда один из элементов соответствует заданному шаблону. Это полезно при подборе последовательности элементов, в которой последний элемент в группе имеет какой-либо отличительный атрибут, например,
continued="no"
. composite?
- boolean
- Может использоваться при группировке с помощью
group-by
илиgroup-adjacent
. Если установлено значениеyes
, то выраженияgroup-by
иgroup-adjacent
могут оцениваться как последовательность, и группировка выполняется путем сравнения всей последовательности. Если установлено значение no (по умолчанию), то когдаgroup-by
оценивается в последовательность, соответствующий элемент имеет несколько ключей группировки и входит в несколько групп; в случаеgroup-adjacent
, ключ группировки, имеющий значение последовательности, является ошибкой. collation?
- { uri }
- Имя последовательности группировки, используемое при сравнении ключей группировки. Может использоваться при группировке с помощью
group-by
илиgroup-adjacent
. Если присутствует, то это должен быть URI свертки, использующий схему и путьhttp://www.w3.org/2013/collation/UCA
, в этом случае он запрашивает использование алгоритма свертки Юникода, или же это свертка, иначе распознанная Saxon: см. раздел "Свертка".
Заметки по реализации Saxon¶
В ранних проектах XSLT 3.0 были введены новые атрибуты bind-group
и bind-grouping-key
; они больше не поддерживаются, начиная с версии Saxon 9.6.
Атрибут composite
был реализован начиная с версии Saxon 9.6.
Начиная с версии 9.6, Saxon поддерживает потоковое группирование при использовании атрибутов group-adjacent
, group-starting-with
или group-ending-with
. Потоковая группировка с атрибутом group-by
стала доступна в релизах поддержки 9.7 и полностью поддерживается в Saxon 9.8 (в этом случае инструкция xsl:for-each-group
должна появляться в xsl:fork
).
Подробности¶
Существует четыре возможных способа определения группировки с использованием различных атрибутов: group-by
, group-adjacent
, group-starting-with
и group-ending-with
.
В XSLT 3.0 возможности инструкции xsl:for-each-group
расширены за счет того, что шаблон, используемый в group-starting-with
или group-ending-with
, теперь может соответствовать как атомарным значениям, так и узлам.
Примеры¶
Примеры использования инструкции см. в спецификации XSLT 2.0.