Subject: RE: [xsl] Efficently transposing tokenized data From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 4 Nov 2008 23:44:13 -0000 |
I can suggest several approaches, but I don't guarantee that any of them will perform better than doing the repeated (wasteful) tokenization. (1) Do a preprocessing pass in which you split the data attribute into multiple elements, then proceed "as normal". (2) Do a preprocessing pass to compute a sequence of NxM strings in one big sequence, then operate by indexing into this big sequence. (3) Write a user-defined function that calls tokenize() but with saxon:memo-function="yes", so that the results of tokenizing a node are remembered when you tokenize the same node again. I think I would probably go for (2) as it's simplest: <xsl:variable name="bigArray" select="for $x in Line return tokenize($x/@data, '\s')"/> <xsl:variable name="columns" select="count(Line)"/> <xsl:for-each select="1 to xs:integer(@samples)"> <xsl:variable name="row" select="."/> <tr> <xsl:for-each select="1 to $columns"> <xsl:variable name="col" select="."/> <td><xsl:value-of select="$bigArray[(:some function of $row and $column, an exercise for the reader:)] Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Beldaz Jalfrezi [mailto:beldazj@xxxxxxxxxxxx] > Sent: 04 November 2008 23:13 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Efficently transposing tokenized data > > Hi XSL-List members, > > I have been learning my way around XSLT (2.0) over the past > couple of weeks, principally using Saxon-B 9.1. I have an > immediate need to transform existing XML data, initially to > HTML. The XML contains, similar to SVG, space-tokenized > numerical data held within attributes. What I am having > trouble understanding is how to transform several nodes with > such data into individual columns of data. > > The XML is like this: > <MultiLine samples="5"> > <Line title="Line 1" data="0.1 0.4 0.6 0.4 0..8" /> <Line > title="Line 2" data="0.4 0.2 0.5 1.4 3.8" /> </MultiLine> > > There can be any number of <Line> nodes (typically 3 or 4) > and the number of values (samples) in each data attribute for > each <Line> must match the samples attribute of the parent > <MultiLine> node. The number of samples can be very long, > typically several thousand. At present this is the data that > I am being supplied, so regardless of any shortcomings of the > structure (although suggestions for improvement are welcome) > I am stuck with it. > > I want to transform such data into, e.g., HTML columns, like: > <TABLE> > <TR> > <TH>Line 1</TH><TH>Line 2</TH> > </TR> > <TR> > <TD>0.1</TD><TD>0.4</TD> > </TR> > <TR> > <TD>0.4</TD><TD>0.2</TD> > </TR> > <TR> > <TD>0.6</TD><TD>0.5</TD> > </TR> > ... > </TABLE> > > I have seen similar questions where people have wanted to > transpose HTML table data, but the problem here is that the > input data has to be tokenized. I can output the data > sequentially for each Line with a template such as: > <xsl:template match="Line"> > <TR><TH><xsl:value-of select="@title" /></TH><TR> > <xsl:for-each select="tokenize(@data,' ')"> > <TR><TD> > <xsl:value-of select="position()" /> > </TD></TR> > <xsl:value-of select="." /> > </xsl:for-each> > </xsl:template> > > To format the data as adjacent columns the only approach I > can think of is a for-each loop over the number of samples, > and in each case call index-at(tokenize(../Line[n]/@data, ' > '), position()) for each Line. But this looks horribly > inefficient, since I appear to be tokenizing every @data > attribute repeatedly, presumably giving complexity > O(count(Line)*samples^2). What would be far more preferable > is to tokenize all the lines, and then at each index obtain > the appropriate value from each sequence. But I have no idea > how to do that in XSLT. > > I have spent at least a day trying to solve this conumdrum, > so if anyone has any suggestions I would be very grateful. > > Kind regards, > > Beldaz > > > > Search 1000's of available singles in your area at the > new Yahoo!7 Dating. Get Started > http://au.dating.yahoo.com/?cid=53151&pid=1011
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Efficently transposing tokeni, Beldaz Jalfrezi | Thread | Re: [xsl] Efficently transposing to, Michael Ludwig |
[xsl] Efficently transposing tokeni, Beldaz Jalfrezi | Date | Re: [xsl] Efficently transposing to, Dimitre Novatchev |
Month |