xsl-list
[Top] [All Lists]

Re: [xsl] Question on streaming and grouping with nested keys

2017-07-14 07:05:00
Thank you for your feedback, Martin and David.


I tried the example from Martin with

<xsl:template match="TRANSACTION-LIST">
     <xsl:copy>
        <xsl:for-each-group select="copy-of(TRANSACTION)"
group-by="ITEM2/SUBITEM2/GROUPING-KEY">
           <xsl:copy>
              <item1-sum><xsl:value-of
select="sum(current-group()/ITEM2/SUBITEM2.1)"/></item1-count>

...

It gives me an of memory error. The input file is 160MB, but the individual
transactions are rather small (around 20+ elements). The error also appears
if I remove "<xsl:copy>".


I have a working solution using an accumulator and maps, see below, but
here I did not manage to use streaming. If I set the accumulator to
 streamable="yes", Saxon EE tells me


"The xsl:accumulator-rule/@select expression for a streaming accumulator
must be motionless"


Although I am using xsl-copy() as in Martin's example.


 <xsl:accumulator name="gather-values" as="map(xs:anyAtomicType, node())"
initial-value="map{}">
    <xsl:accumulator-rule match="TRANSACTION">
      <xsl:variable name="current" select="copy-of()"/>
      <xsl:variable name="currentKey"
select="$current/ITEM2/SUBITEM2/GROUPING-KEY"/>
      <xsl:choose>
        <xsl:when test="map:contains($value, $currentKey)">
          <xsl:variable name="amount">
            <amount>
              <xsl:value-of
                select="map:get($value, $currentKey)/amount +
xs:decimal($current/ITEM2/SUBITEM2.1)"
              />
            </amount>
          </xsl:variable>
          <xsl:sequence
            select="
              map:put($value, $currentKey,
              $amount)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:variable name="amount">
            <amount>
              <xsl:value-of select="xs:decimal($current/ITEM2/SUBITEM2.1)"/>
            </amount>
          </xsl:variable>
          <xsl:sequence select="map:put($value, $currentKey, $amount)"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:accumulator-rule>
  </xsl:accumulator>


- Felix







2017-07-14 10:17 GMT+02:00 Martin Honnen martin(_dot_)honnen(_at_)gmx(_dot_)de <
xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com>:



Am 14.07.2017 um 09:09 schrieb Felix Sasaki felix(_at_)sasakiatcf(_dot_)com:

I want to analyse a list of transactions in XSLT 3.0 streaming mode.
Transactions should be grouped by a key which is nested inside each
transaction (see SUBITEM2.2/GROUPING-KEY below). For the grouped
transactions, there are items to count or items with numeric values to some
up, see ITEM1 and ITEM2/SUBITEM2.1.


<TRANSACTION-LIST>
  <TRANSACTION>
    <ITEM1> something to count </ITEM1>
    <ITEM2>
      <SUBITEM2.1> something to sum up</SUBITEM2.1>
      <SUBITEM2.2> ...
        <GROUPING-KEY>some-key</GROUPING-KEY>
      </SUBITEM2.2>
    </ITEM2>
  </TRANSACTION> ...
</TRANSACTION-LIST>

  The output should be a list as follows:
- Transaction following grouping key value 1:
    Numbers of ITEM1
    Sum of ITEM 2
- Transactions following grouping key value 2, 3, ...n: the same list with
other values.

See also https://stackoverflow.com/questions/44287959/xslt-3-0-
streaming-with-grouping-and-sum-accumulator/44291127#44291127 for a
similar problem and some worked out code samples trying to tackle the
problem.
XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
EasyUnsubscribe <-list/3033841> (by
email <>)

--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>