xsl-list
[Top] [All Lists]

Re: Merging and sorting multiple XML files

2004-07-29 05:54:31
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(_at_)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[(_at_)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[(_at_)t
=$curTime]/*" />
        </xsl:copy>
</xsl:template>
 
</xsl:stylesheet>



--- David Carlisle <davidc(_at_)nag(_dot_)co(_dot_)uk> 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

________________________________________________________________________

--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--





<Prev in Thread] Current Thread [Next in Thread>