Описание тега xslt-grouping
Группировка в XSLT 3
Группировка в XSLT 3, текущей и последней версии XSLT с 2017 года, может быть достигнута в первую очередь с помощью xsl:for-each-group
инструкция, в которой вы выбираете элементы для группировки, группирующую совокупность, сselect
атрибут, а затем есть три разных способа группировки населения:
- то
group-by
атрибут, выбирающий последовательность ключей группировки, по которой группируемая совокупность должна быть сгруппирована - то
group-adjacent
атрибут, выбирающий последовательность ключей группировки, по которой должны быть сгруппированы смежные элементы совокупности - то
group-starting-with
илиgroup-ending-with
атрибуты, определяющие шаблоны для идентификации и запуска групп на основе сопоставления с образцом начального (group-starting-with
) или финал (group-ending-with
) член группы
Доступ к элементам обрабатываемой в данный момент группы предоставляется current-group()
функция, доступ к текущей клавише группировки current-grouping-key()
функция.
Спецификация XSLT 3 дает по крайней мере один пример для каждого подхода к группировке непосредственно в разделе спецификации https://www.w3.org/TR/xslt-30/; ниже вы найдете ссылки на скрипты XSLT, основанные на этих примерах:
- группировка элементов на основе одного общего значения, используя
group-by
: https://xsltfiddle.liberty-development.net/ncdD7mq/1 - группировка элементов на основе последовательности значений в качестве ключа группировки, то есть составного ключа, с использованием
group-by
: https://xsltfiddle.liberty-development.net/pPzifps - группировка альтернативных последовательностей элементов с помощью
group-adjacent
: https://xsltfiddle.liberty-development.net/3NJ38Zc - идентификация группы по ее начальному элементу, используя
group-starting-with
: https://xsltfiddle.liberty-development.net/bnnZWa - идентификация группы по ее последнему элементу, используя
group-ending-with
: https://xsltfiddle.liberty-development.net/6r5Gh3e - группирование предметов в несколько групп с помощью
group-by
еслиgroup-by
выражение дает последовательность из более чем одного значения: https://xsltfiddle.liberty-development.net/94rmq6g
Конечно, разные подходы могут быть объединены для более сложных задач путем вложения xsl:for-each-group
инструкции.
XSLT 3 с поддержкой XPath 3.1 также может группировать JSON, представленные в виде карт и массивов XPath 3.1, вот список, показывающий предыдущие образцы группировки XML, теперь использующие ввод JSON и напрямую группирующие структуру данных карты / массива, возвращенную parse-json
функция:
- группировка элементов на основе одного общего значения, используя
group-by
: https://xsltfiddle.liberty-development.net/jyRYYip - группировка элементов на основе последовательности значений в качестве ключа группировки, то есть составного ключа, с использованием
group-by
: https://xsltfiddle.liberty-development.net/ncdD7mr - идентификация группы по ее начальному элементу, используя
group-starting-with
: https://xsltfiddle.liberty-development.net/pPzifpt - идентификация группы по ее последнему элементу, используя
group-ending-with
: https://xsltfiddle.liberty-development.net/bnnZWb - группирование предметов в несколько групп с помощью
group-by
еслиgroup-by
выражение дает последовательность из более чем одного значения: https://xsltfiddle.liberty-development.net/3NJ38Zd - группирование предметов в несколько групп с помощью
group-by
еслиgroup-by
выражение дает последовательность из более чем одного значения, на этот раз с выводом JSON: https://xsltfiddle.liberty-development.net/3NJ38Zd/1
Группировка в XSLT 2
Группировка в XSLT 2 также работает с xsl:for-each-group
инструкция как в XSLT 3, основные ограничения, что XSLT 2 не поддерживает составные ключи группировки (так сгруппировать по различным пунктам необходимоconcat
или string-join
их как одно значение (например, composite="yes" group-by="foo, bar"
в XSLT 3 нужно делать как group-by="string-join((foo, bar), '|')"
)) и что сопоставление с образцом может выполняться только на узлах, а не на примитивных значениях.
Спецификация XSLT 2 дает по крайней мере один пример для каждого подхода к группировке непосредственно в разделе спецификации https://www.w3.org/TR/xslt20/; ниже вы найдете ссылки на скрипты XSLT, основанные на этих примерах:
- группировка элементов на основе одного общего значения, используя
group-by
: https://xsltfiddle.liberty-development.net/jyRYYiq - группировка элементов на основе составного, сцепленного ключа группировки с использованием
group-by
: https://xsltfiddle.liberty-development.net/ncdD7ms - группировка соседних узлов с помощью
group-adjacent
: https://xsltfiddle.liberty-development.net/3NJ38Ze - группирование узлов на основе шаблона исходного узла в группе, используя
group-starting-with
: https://xsltfiddle.liberty-development.net/pPzifpu - группирование узлов на основе образца последнего узла в группе с использованием
group-ending-with
: https://xsltfiddle.liberty-development.net/bnnZWc group-by
пример добавления элемента в несколько групп, если выражение ключа группировки возвращает последовательность из более чем одного значения: https://xsltfiddle.liberty-development.net/6r5Gh3g