Subject: RE: [xsl] Re: merging and regrouping multiple xml files From: "John Reid" <John.Reid@xxxxxxxxxxxxxxx> Date: Sun, 7 Sep 2003 10:33:11 +1000 |
Thanx Dimitre, worked first time and gave me a method I can use. I gave it 8MB of data and it was quick( 20 secs) Salud John -----Original Message----- From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Dimitre Novatchev Sent: Saturday, 6 September 2003 8:52 PM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: [xsl] Re: merging and regrouping multiple xml files Using a two-pass transformation: 1. Get the nodes from all the files into one document 2. Group -- e.g. using the Muenchian method This transformation implements the above solution: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:key name="kAsxCode" match="asx" use="code"/> <xsl:template match="/"> <xsl:variable name="vrtfMerged"> <xsl:copy-of select="document(/*/doc/@filename)"/> </xsl:variable> <xsl:variable name="vMerged" select="ext:node-set($vrtfMerged)"/> <merged> <xsl:for-each select="$vMerged"> <xsl:for-each select="xchange/asx[generate-id() = generate-id(key('kAsxCode', code)[1]) ]"> <asx id="{normalize-space(code)}"> <xsl:for-each select="key('kAsxCode', code)"> <day id="{normalize-space(date)}"> <xsl:copy-of select="*[not(self::date or self::code)]"/> </day> </xsl:for-each> </asx> </xsl:for-each> </xsl:for-each> </merged> </xsl:template> </xsl:stylesheet> When applied on this source.xml: <masterfile> <doc filename="file08.xml"/> <doc filename="file09.xml"/> </masterfile> and using the same contents for file08.xml and file09.xml as defined in your message, the wanted result is produced: <merged> <asx id="AAB"> <day id="030905"> <op> 88</op> <hi> 88</hi> <lo> 88</lo> <cl> 88</cl> <vol> 10</vol> </day> <day id="030906"> <op> 88</op> <hi> 88</hi> <lo> 86</lo> <cl> 88</cl> <vol> 20</vol> </day> </asx> <asx id="AAC"> <day id="030905"> <op> 129</op> <hi> 129</hi> <lo> 127</lo> <cl> 128</cl> <vol> 99757</vol> </day> <day id="030906"> <op> 129</op> <hi> 129</hi> <lo> 127</lo> <cl> 128</cl> <vol> 99888</vol> </day> </asx> </merged> ===== Cheers, Dimitre Novatchev. http://fxsl.sourceforge.net/ -- the home of FXSL "John Reid" <John.Reid@xxxxxxxxxxxxxxx> wrote in message news:000d01c37452$c43b0b50$0100a8c0@xxxxxxxx > I think this is a problem of grouping. I want to tranform a number of > xml files into one. At the same time regrouping them. The masterfile > contains the list of files to be merged and file 08 and file09 give > representative input data. The last list is the desired outcome. I have > looked up this type of problem but.. > > Salud > > John > > <masterfile> > <doc filename="file08.xml"/> > <doc filename="file09.xml"/> > <doc filename="file10.xml"/> > <doc filename="file11.xml"/> > <doc filename="file12.xml"/> > <doc filename="file13.xml"/> > <doc filename="file14.xml"/> > <doc filename="file15.xml"/> > <doc filename="file16.xml"/> > <doc filename="file17.xml"/> > <doc filename="file18.xml"/> > <doc filename="file19.xml"/> > <doc filename="file20.xml"/> > </masterfile> > > file08 > > <xchange> > <asx> > <code>AAB</code> > <date>030905</date> > <op>88</op> > <hi>88</hi> > <lo>88</lo> > <cl>88</cl> > <vol>10</vol> > </asx> > <asx> > <code>AAC</code> > <date>030905</date> > <op>129</op> > <hi>129</hi> > <lo>127</lo> > <cl>128</cl> > <vol>99757</vol> > </asx> > </xchange> > > file09 > <xchange> > <asx> > <code>AAB</code> > <date>030906</date> > <op>88</op> > <hi>88</hi> > <lo>86</lo> > <cl>88</cl> > <vol>20</vol> > </asx> > <asx> > <code>AAC</code> > <date>030906</date> > <op>129</op> > <hi>129</hi> > <lo>127</lo> > <cl>128</cl> > <vol>99888</vol> > </asx> > </xchange> > > Merged OutPut > > <merged> > <asx id="AAB"> > <day id="030905"> > <op>88</op> > <hi>88</hi> > <lo>88</lo> > <cl>88</cl> > <vol>10</vol> > </day> > <day id="030906"> > <op>88</op> > <hi>88</hi> > <lo>86</lo> > <cl>88</cl> > <vol>20</vol> > </day> > </asx> > <asx id="AAC"> > <day id="030905"> > <op>129</op> > <hi>129</hi> > <lo>127</lo> > <cl>128</cl> > <vol>99757</vol> > </day> > <day id="030906"> > <op>129</op> > <hi>129</hi> > <lo>127</lo> > <cl>128</cl> > <vol>99888</vol> > </day> > </asx> > Ken Holman gave the below code for something similar and while I feel > that I should be able to adapt it, I could not. > > <?xml version="1.0" encoding="iso-8859-1"?> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > > <xsl:output indent="yes"/> > > <xsl:template match="masterfile"> > <merged> > <xsl:variable name="clients" > select="document(doc/@filename)/client"/> > > <xsl:for-each select="$clients"> > <xsl:if test="generate-id(.)= > generate-id($clients[name=current()/name])"> > <client> > <xsl:copy-of select="name"/> > <xsl:copy-of > select="$clients[name=current()/name]/subclient"/> > </client> > </xsl:if> > </xsl:for-each> > </merged> > </xsl:template> > > </xsl:stylesheet> > </merged> > > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Re: merging and regrouping mu, Dimitre Novatchev | Thread | [xsl] xsltproc: process >1 included, Josef El-Rayes |
Re: [xsl] xsltproc: process >1 incl, Daniel Veillard | Date | RE: [xsl] Building a Manual with XM, Iván Montoro Ten |
Month |