xsl-list
[Top] [All Lists]

[xsl] Question on XSLT streaming and accumulation of values

2017-10-15 14:26:23
Accidentally I sent the below mail to the wrong mail address, and inbetween
found a solution to the issue: using for the accumulator
match="group-meta1/text()" select="string(.)"

In case there are other solutions, I am eager to learn about them .


I have an XML input of the following structure

    <GROUP>
        <group-meta1>metainfo-group-1</group-meta1>
        <TRANSACTION>
            <transaction-meta>
                <transaction-meta1>metainfo-transaction-1</transaction-
meta1>
            </transaction-meta>
            <loop1>...</loop1>
            <loop2>to be done1</loop2>
            <loop2>to be done2</loop2>
        </TRANSACTION>
    </GROUP>

I want to process all loop2 elements with XSLT 3.0 streaming. For each
loop2 element, there should be a uri generated which is defined as follows:

    value of group-meta1 + "/" + value of group-meta2 + "/" + loop2 number

That is for the loop2 with the value "to be done" the uri

    /metainfo-group-1/metainfo-transaction-1/1.xml

And for the second loop2 the uri

    /metainfo-group-1/metainfo-transaction-1/2.xml


Is this possible with streaming? I tried templates gathering the
metainformation, but that works only if I use copy-of to gather the
meta-information, e.g. in this template:

<xsl:template mode="process-loop2" match="GROUP">
        <xsl:variable name="current-group" select="copy-of(.)" />
        <xsl:apply-templates mode="process-loop2" select="$current-group/*">
            <xsl:with-param name="group-meta1" select="$current-group/group-
meta1"/>
        </xsl:apply-templates>
    </xsl:template>


The issue with this solution is that I need to keep the whole GROUP element
in memory, via copy-of(), and a group already can be several gigabyte. With
saxon, that leads to an out-of-memory error.

I guess the problem is that I want to do two things within one stream: go
into the metadata subtrees of GROUP or TRANSACTION, and use that
information in the loop2 nested elements, which are not in the metadata
subtrees. That may not be possible.

I found a solution with streaming accumulators for gathering the GROUP
position:

<xsl:accumulator name="group-position" as="xs:integer" initial-value="0"
streamable="yes">
 <xsl:accumulator-rule match="GROUP" select="$value + 1" />
</xsl:accumulator>

But I did not find a solution for gathering with a streaming accumulator,
and then using the value of group-meta1, in the uri construction template.
An accumulator as follows
<xsl:accumulator name="group-meta" as="xs:integer" initial-value="0"
streamable="yes">
 <xsl:accumulator-rule match="group-meta1" select="." />
</xsl:accumulator>

Gives me an error that the accumulator needs to be motion less.

Best,

Felix
--~----------------------------------------------------------------
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>