|
Subject: Re: [xsl] XPath expression that yields the same result as xsl:for-each-group? From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 30 May 2019 14:10:08 -0000 |
I would normally use maps for grouping in XPath 3.1. Ignoring the problem of
composite keys
map:merge(//row ! map:entry( key, .),
map{"duplicates":"combine"})
If the grouping key is composite, as in this example, then you can either form
a key by string concatenation, or use a multi-level map.
Michael Kay
Saxonica
> On 30 May 2019, at 14:06, Martin Honnen martin.honnen@xxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> On 30.05.2019 14:46, Costello, Roger L. costello@xxxxxxxxx wrote:
>> Hello XSLT/XPath experts!
>>
>> My XML document consists of a series of rows.
>>
>> Each row is identified by the combination of two child elements:
ARPT__IDENT and TRM__IDENT.
>>
>> I want to group the rows. A group consists of those rows with the same
ARPT__IDENT and TRM__IDENT.
>>
>> This XML document:
>>
>> <Test>
>> <row>
>> <ARPT__IDENT>A</ARPT__IDENT>
>> <TRM__IDENT>X</TRM__IDENT>
>> <Data>Foo</Data>
>> </row>
>> <row>
>> <ARPT__IDENT>A</ARPT__IDENT>
>> <TRM__IDENT>X</TRM__IDENT>
>> <Data>Bar</Data>
>> </row>
>> <row>
>> <ARPT__IDENT>A</ARPT__IDENT>
>> <TRM__IDENT>Y</TRM__IDENT>
>> <Data>Blah</Data>
>> </row>
>> <row>
>> <ARPT__IDENT>A</ARPT__IDENT>
>> <TRM__IDENT>Y</TRM__IDENT>
>> <Data>Plugh</Data>
>> </row>
>> </Test>
>>
>> is to be grouped this way:
>>
>> <results>
>> <group>
>> <row>
>> <ARPT__IDENT>A</ARPT__IDENT>
>> <TRM__IDENT>X</TRM__IDENT>
>> <Data>Foo</Data>
>> </row>
>> <row>
>> <ARPT__IDENT>A</ARPT__IDENT>
>> <TRM__IDENT>X</TRM__IDENT>
>> <Data>Bar</Data>
>> </row>
>> </group>
>> <group>
>> <row>
>> <ARPT__IDENT>A</ARPT__IDENT>
>> <TRM__IDENT>Y</TRM__IDENT>
>> <Data>Blah</Data>
>> </row>
>> <row>
>> <ARPT__IDENT>A</ARPT__IDENT>
>> <TRM__IDENT>Y</TRM__IDENT>
>> <Data>Plugh</Data>
>> </row>
>> </group>
>> </results>
>>
>> I can use xsl:for-each-group to perform the grouping:
>>
>> <xsl:template match="Test">
>> <xsl:variable name="rows" select="row" as="element(row)*"/>
>> <results>
>> <xsl:for-each-group select="$rows" group-by="concat(ARPT__IDENT,
'|', TRM__IDENT)">
>> <group>
>> <xsl:sequence select="current-group()" />
>> </group>
>> </xsl:for-each-group>
>> </results>
>> </xsl:template>
>>
>> However, I want to create a variable -- $groups -- which holds the groups
and then iterate over the variable:
>>
>> <results>
>> <xsl:for-each select="$groups">
>> <group>
>> <xsl:sequence select="." />
>> </group>
>> </xsl:for-each>
>> </results>
>>
>> What XPath expression will yield the desired value for $groups?
>>
>> <xsl:variable name="groups" select="???" />
>>
>> Is there an XPath 2.0 expression that can be used?
>
> What kind of sequence type would you expect that XPath expression to
> return? You can't build sequences of sequences to somehow wrap the items
> belonging to a group.
>
> So unless you could move to XPath 3.1 with maps and/or arrays I don't
> see an XPath type constructed with pure XPath to hold groups. And of
> course even there it would be easier and smarter to use XSLT to create
> the map or the nested sequence/array or array/sequence structure than to
> rely on pure XPath I think.
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] XPath expression that yie, Martin Honnen martin | Thread | Re: [xsl] XPath expression that yie, Martin Honnen martin |
| Re: [xsl] XPath expression that yie, Martin Honnen martin | Date | Re: [xsl] XPath expression that yie, Martin Honnen martin |
| Month |