[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: streaming XSLT creating a header from a first reco

Subject: Re: streaming XSLT creating a header from a first record
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 8 May 2018 16:03:46 -0000
Re:  streaming XSLT creating a header from a first reco
I don't think you need two accumulators, you can have a single accumulator
that matches every row and only creates the map if the current value is an
empty map.

Another way to do this is with xsl:iterate: iterate over the rows with an
xsl:param holding the column names found in the first row (initial value is
map{}); within the xsl:iterate, do an xsl:choose; when test="position()=1" do
an xsl:next-iteration with a populated map as the xsl:with-param parameter
value; otherwise process the row and just do a defaulted xsl:next-iteration
which processes the next row with unchanged parameter values.

Michael Kay
Saxonica

> On 8 May 2018, at 16:55, Martin Honnen martin.honnen@xxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> On 08.05.2018 17:33, Martin Honnen martin.honnen@xxxxxx wrote:
>> On 08.05.2018 17:19, Geert Bormans geert@xxxxxxxxxxxxxxxxxxx wrote:
>>> All,
>>>
>>> I have a potentially huge tabular structure in an XML file: one "table''
element, many "row" elements, each having a series of attributes
>>>
>>> I want to process them using a streaming XSLT, but I am hitting an issue
>>>
>>> I want to use information from the first row in a header construct, in a
way using the first row information twice
>>> That is fairly easy done if the result were something like CSV, because
then I can deal with the header and first row in one go
>>> but now I need the header in some sort of metadata section at the start of
the document
>>> and all the rows including row one in an adjacent structure, but wrapped
(the results of the row processing in a container)
>>>
>>> I tried to create the full structure in a template for the first row and
process the following siblings of the first row... but that can't be done
"when the context posture is striding" (sic)
>>>
>>> Any ideas? Thanks,
>> How about setting up an accumulator
>> <xsl:accumulator name="first-row-values" as="map(xs:string, xs:string)"
initial-value="map{}" streamable="yes">
>>   <xsl:accumulator-rule match="table/row[1]"
>>      select="map:merge(@*!map { node-name() : data(.) })"/>
>> </xsl:accumulator>
>> then you can use that map in all following rows.
>
>
> Hm, I forgot that you can't have positional predicates in a streamable match
pattern so it seems you first need to set up an additional accumulator
counting the rows and then to make sure the other accumulator only stores the
attribute values for the first row. Additionally I had the wrong map type, so
>
> 	<xsl:mode streamable="yes" on-no-match="shallow-copy"
use-accumulators="#all"/>
>
>
> 	<xsl:accumulator name="row-count" as="xs:integer" streamable="yes"
initial-value="0">
> 		<xsl:accumulator-rule match="table/row" select="$value + 1"/>
> 	</xsl:accumulator>
>
> 	<xsl:accumulator name="first-row-values" as="map(xs:QName, xs:string)"
initial-value="map{}" streamable="yes">
> 		<xsl:accumulator-rule match="table/row"
> 			select="if (accumulator-before('row-count') eq 1)
> 			        then map:merge(@*!map { node-name() : string(.) })
> 			        else $value"/>
> 	</xsl:accumulator>
>
>
> should work better. Only drawback is that maps don't preserve the order of
entries although as the data comes from XML attributes which aren't ordered
either that might not matter.

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.