Questions tagged [xslt-grouping]

Grouping mechanisms that are specific to XSLT. Should always be complemented with either the xslt-1.0, xslt-2.0 or xslt-3.0 tag to indicate the version used.

Grouping in XSLT 3

Grouping in XSLT 3, the current and latest version of XSLT since 2017, can be achieved primarily using the xsl:for-each-group instruction where you select the items to be grouped, the grouping population, with the select attribute and then have three different ways to group the population:

  1. the group-by attribute selecting a sequence of grouping keys by which the grouping population is to be grouped
  2. the group-adjacent attribute selecting a sequence of grouping keys by which adjacent items in the population are to be grouped
  3. the group-starting-with or group-ending-with attributes defining patterns to identify and start groups based on pattern matching of the initial (group-starting-with) or final (group-ending-with) member of a group

Access to the items of a currently processed group is given by the current-group() function, access to the current grouping key by the current-grouping-key() function.

The XSLT 3 specification gives at least one example for each grouping approach directly in the specification section https://www.w3.org/TR/xslt-30/#grouping-examples; below you find links to XSLT fiddles based on these examples:

Of course the different approaches can, for more complex tasks, be combined by nesting xsl:for-each-group instructions.

XSLT 3 with XPath 3.1 support can also group JSON represented as XPath 3.1 maps and arrays, here is a list of showing the previous XML grouping samples now using JSON input and directly grouping the map/array data structure returned by the parse-json function:

Positional grouping

Positional grouping can be used to split a sequence of items into groups of a certain size; in XSLT 2 or 3 this is easily achieved using e.g. for-each-group select="foo" group-adjacent="(position() - 1) idiv $chunk-size": https://xsltfiddle.liberty-development.net/asoTK9

https://martin-honnen.github.io/xslt/generic-positional-grouping-functions.xsl is a compact XSLT 3 module using higher-order functions importable by other code that needs to split up a sequence of items using positional grouping, you could use it as follows (Saxon-JS 2, Saxon 10 or higher all editions, Saxon 9.8 or higher PE and EE, Altova XML 2017 R3 or later)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mf="http://example.com/mf"
    xmlns:ex="http://example.com/ex"
    exclude-result-prefixes="#all"
    expand-text="yes">

  <xsl:import href="https://martin-honnen.github.io/xslt/generic-positional-grouping-functions.xsl"/>

  <xsl:function name="ex:wrap-rows" as="element()">
    <xsl:param name="group" as="item()*"/>
    <xsl:param name="pos" as="xs:integer"/>
    <xsl:param name="wrapper-name" as="xs:QName"/>
    <xsl:element name="{$wrapper-name}" namespace="{namespace-uri-from-QName($wrapper-name)}">
      <xsl:attribute name="index" select="$pos"/>
      <xsl:sequence select="$group"/>
    </xsl:element>
  </xsl:function>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="root">
    <root>
      <xsl:sequence select="mf:group-chunks(item, 3, ex:wrap-rows(?, ?, QName('', 'chunk')))"/>
    </root>
  </xsl:template>

  <xsl:template match="/">
    <xsl:next-match/>
    <xsl:comment>Run with {system-property('xsl:product-name')} {system-property('xsl:product-version')} {system-property('Q{http://saxon.sf.net/}platform')}</xsl:comment>
  </xsl:template>

</xsl:stylesheet>

to e.g. wrap any chunk into a container element.

Grouping in XSLT 2

Grouping in XSLT 2 also works with the xsl:for-each-group instruction as in XSLT 3, the main restrictions are that XSLT 2 does not support composite grouping keys (so to group on various items you need to concat or string-join them as single value (e.g. composite="yes" group-by="foo, bar" in XSLT 3 needs to be done as group-by="string-join((foo, bar), '|')")) and that pattern matching can only be done on nodes, not on primitive values.

The XSLT 2 specification gives at least one example for each grouping approach directly in the specification section https://www.w3.org/TR/xslt20/#grouping-examples; below you find links to XSLT fiddles based on these examples:

Grouping in XSLT 1.0

The preferred solution in XSLT 1.0 is to use the Muenchian grouping method:
http://www.jenitennison.com/xslt/grouping/muenchian.html

552 questions
1
vote
1 answer

XSLT 1.0 Problems with group and subgrouping data - Muenchian method - nested grouping

I have a xml data export and want to transform the data for further reprocessing, xslt 1.0 is demanded. I know the form is a little bit unusual but this is the required form. I'm quite new to xsl so I would be really thankful for your help. This is…
1
vote
1 answer

XSLT - Update value based on conditions from child of sibling element

I need to update event and eventReason of Job from Job_event based on values by comparing fields "startdate", "J_Seq_Number" of Job with fields "eventDate", "JE_Seq_Number" of Job_event. Any help would be appreciate, Thank you. Input XML …
1
vote
1 answer

Better way to merge node and sum attribute value based on another attribute value using single template in XSLT(1.0)

I need to get unique role with bar as child nodes where role/@totalQty is sum of all qty for that role. This has to be in 1 template using XSLT 1.0 I have written the following code. Is there a better way I can do it with lesser loops as I am…
2FaceMan
  • 443
  • 2
  • 18
  • 34
1
vote
1 answer

Need Help in Munechian grouping to calculate the for-each variable outputs

Please help in summation logic where I am getting an error while adding the variable value. XML below
1
vote
1 answer

Using xsl group-starting-buy to group-by elements between two nodes

So I have an XML that resembles to something of this type which I would like to convert into wikicode:

Heading 1

Filepath 1 Filename 1 Desc…
Syed Shah
  • 13
  • 2
1
vote
0 answers

XSLT 2.0 Get distinct values using multiple elements

I have child element "Report_Entry" with sibling elements "employeeID, plan and startDate". I want to find distinct values using the sibling elements. If the combination of three elements is repeating, I want to eliminate any duplicate values. I am…
1
vote
1 answer

Combine Nodes (XML) with the same ID and their values using XSLT

I'm new to XSLT and I'm still learning. I currently face an issue where I need to combine nodes with the same ID. The nodes with the same ID will have different values and these values need to be combined as well. Below is my initial sample…
egx
  • 389
  • 2
  • 14
1
vote
1 answer

combine/group xml element attributes in one line

need help on how can I have all brand(?) in one line for each brands under the same record id? input xml
emma.a
  • 13
  • 5
1
vote
1 answer

How to group by with two node and count the value in XSLT transformation

I have a requirement with xml file: i have to group by value of two nodes, and count value also.But i'm a new guys in XSLT, please help me. Input Xml:
1
vote
2 answers

how to loop through current-group in xslt3.0 and print each value

I have a input json in the format [ { "PERSON_ID": 78, "EFFECTIVE_START_DATE": "2013-12-02 00:00:00", "LAST_NAME": "Hulk78" }, { "PERSON_ID": 78, "EFFECTIVE_START_DATE": "2020-06-24 07:29:26", "LAST_NAME": "Hulks78" }, { …
prateeknaik
  • 71
  • 1
  • 7
1
vote
1 answer

XSL grouping and wrapping of tags

Need some help with one xsl transformation. I got an XML with the following format

First Vid

test

TEST ME NOTE

1
vote
1 answer

Right padding a String with Zeros in XSLT

I need to right pad this with leading zeros to a length of 3 in the output (which is fixed length text) Examples: A becomes A00 AB becomes AB0 ABC becomes ABC Please help.
1
vote
1 answer

How to retrieve an xml document and group nodes based on attribute value using XSLT

So lets assume that my transaction body is completely empty when I start the transformation. I have an xml file with some data like this:
xray1986
  • 1,148
  • 3
  • 9
  • 28
1
vote
2 answers
1
vote
1 answer

XSLT - Split large XML into multiple files based on criteria

Im an XSLT 2.0 beginner and trying to find a way to split big xml file into multiple chunks based on the condition. Sample XML: 1 Vcut
Grimmjow
  • 45
  • 10