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

Re: Merging and sorting multiple XML files

Subject: Re: Merging and sorting multiple XML files
From: Herve Dubreuil <hervedub@xxxxxxxxx>
Date: Thu, 29 Jul 2004 05:54:31 -0700 (PDT)
sort xml file
Thanks for this quick answer !

It seems to be working but I've having a problem / bug?

Here is the error that is generated:

[hdubreui@gange vcd test]$ sabcmd -L=log.sabcmd  merge4.xslt 1.xml
out.xml
Error [code:4]
[URI:file:///home/hdubreui/Projects/TAST/development/modules/cc_wave/vcd
test/2.xml] [line:19]
  cannot open file
'/home/hdubreui/Projects/TAST/development/modules/cc_wave/vcd
test/2.xml3.xml'

and if I check the log:
Parsing
'file:///home/hdubreui/Projects/TAST/development/modules/cc_wave/vcd
test/merge4.xslt'...
Parse done in 0.003 seconds
Parsing
'file:///home/hdubreui/Projects/TAST/development/modules/cc_wave/vcd
test/1.xml'...
Parse done in 0.000 seconds
Executing stylesheet
'file:///home/hdubreui/Projects/TAST/development/modules/cc_wave/vcd
test/merge4.xslt'...
Parsing
'file:///home/hdubreui/Projects/TAST/development/modules/cc_wave/vcd
test/list.xml'...
Parse done in -0.000 seconds
Parsing
'file:///home/hdubreui/Projects/TAST/development/modules/cc_wave/vcd
test/2.xml'...
Parse done in 0.000 seconds
cannot open file
'/home/hdubreui/Projects/TAST/development/modules/cc_wave/vcd
test/2.xml3.xml'

So it means it correctly opens the first file of the list but don't
manage to open the second one because it is looking at a wrong
adress... it this a bug of the software (sablotron)

If I just put one file on the list, it is parsed correctly (but I need
to merge ~50 ;-) )

Here is the list:

<?xml version="1.0" ?>
<listoffile>
        <wave filename="2.xml" />
        <wave filename="3.xml" />
</listoffile>

And the xsl modified with your input:

<?xml version="1.0" ?>
<!-- We first start by defining the xsl/xml header -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no"
encoding="UTF-8"/>
 
 
<!-- The first file is passed directly to the parser and then a list is
read from list.xml -->
 
<xsl:variable name="docs"
select="document(document('list.xml')/listoffile/wave/@filename)"/>
 
 
<!-- we apply the template to the whole document -->
<xsl:template match="/">
        <xsl:apply-templates select="PreVCD"/>
</xsl:template>
 
<!--We apply the template component to the node component and the same
to dump -->
<xsl:template match="PreVCD">
        <xsl:copy>
                <xsl:apply-templates select="component" />
                <xsl:apply-templates select="dump" />
        </xsl:copy>
</xsl:template>
 
<!-- In the template component, we copy <component>, then add its
attribute (name) and then copy the subpathes -->
<xsl:template match="component">
        <xsl:copy>
<!-- copy the attribute name -->
                <xsl:copy-of select="@*" />
<!-- Apply the template subpath1 and add the nodes into the path where
the subpath have the same name (regroup) -->
<xsl:apply-templates select="subpath |
$docs/PreVCD/component/subpath[not(@path = current()/subpath/@path)]">
<!-- Sort the nodes by name -->
                        <xsl:sort select="@path" data-type="text"
order="ascending" />
                </xsl:apply-templates>
        </xsl:copy>
</xsl:template>
 
<xsl:template match="subpath">
        <xsl:variable name="curPath" select="@path" />
        <xsl:copy>
                <xsl:copy-of select="@*" />
                <xsl:copy-of select="* |
$docs/PreVCD/component/subpath[@path =$curPath]/*" />
        </xsl:copy>
</xsl:template>
 
 
<!-- In Dump, we have to regroup elements and sort by time -->
<xsl:template match="dump">
        <xsl:copy>
                <xsl:apply-templates select="time |
$docs/PreVCD/dump/time[not(@t = current()/time/@t)]" >
                        <xsl:sort select="@t" data-type="number"
order="ascending" />
                </xsl:apply-templates>
        </xsl:copy>
</xsl:template>
 
<xsl:template match="time">
        <xsl:variable name="curTime" select="@t" />
        <xsl:copy>
                <xsl:copy-of select="@*" />
                <xsl:copy-of select="* | $docs/PreVCD/dump/time[@t
=$curTime]/*" />
        </xsl:copy>
</xsl:template>
 
</xsl:stylesheet>



--- David Carlisle <davidc@xxxxxxxxx> wrote:

> 
> 
> But, is there a way to provide a list and merge all those file at
> once
> like:
> 
> list.xml:
> <listoffile>
>   <wave filename="1.xml">
>   <wave filename="2.xml">
>   <wave filename="3.xml">
> ......
>   <wave filename="50.xml">
> </listoffile>
> 
> 
> 
> 
> given that file you can do
> 
> <xsl:variable name="docs"
> select="document(document('list.xml')/listoffile/wave/@filename)"/>
> 
> then $docs will be a set of / nodes one for each file in your list.
> 
> David
> 
>
________________________________________________________________________
> This e-mail has been scanned for all viruses by Star Internet. The
> service is powered by MessageLabs. For more information on a
> proactive
> anti-virus service working around the clock, around the globe, visit:
> http://www.star.net.uk
>
________________________________________________________________________

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.