Subject: Re: [xsl] Fwd: Combing two different documents From: "andrew welch" <andrew.j.welch@xxxxxxxxx> Date: Mon, 17 Jul 2006 11:26:56 +0100 |
On 7/17/06, David B <daavidb@xxxxxxxxx> wrote: > Hello, > > I am trying to combine to seperate XML documents that have the same > structure but different leaf nodes, e.g: > ---File 1.xml--- > <base> > <foo> > <bar1>123</bar1> > </foo> > </base> > --File 2.xml---- > <base> > <foo> > <bar2>abc</bar2> > </foo> > </base> > > I want the output to be: > <base> > <foo> > <bar1>123</bar1> > <bar2>abc</bar2> > </foo> > </base> > > Preferably without hardcoding too much of the structure of the file > into the .xsl.
How about something like:
<xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template>
<xsl:template match="*[not(*)]"> <xsl:copy-of select="."/> <xsl:copy-of select="$file2//*[not(*)][count(preceding::*) = count(current()/preceding::*)]"/> </xsl:template>
You would apply this transform to file1.xml and reference file2.xml using the document() function.
You could speed it up by using a key for the lookup into $file2 as the heavy using of the preceding axis would likely make this very slow.
If there are a different numbers of leaf nodes at the same point in each file then you would need work on the level above, eg:
<xsl:template match="*[*[not(*)]]"> <xsl:copy> <xsl:copy-of select="*"/> <xsl:copy-of select="$file2//*[*[not(*)]][count(preceding::*) = count(current()/preceding::*)]/*"/> </xsl:copy> </xsl:template>
If there is mixed content at the level above (<foo> level) use copy-of select="node()", but if all your text nodes are contained by leaf nodes then this should be fine.
cheers andrew
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Fwd: Combing two differen, andrew welch | Thread | Re: [xsl] Fwd: Combing two differen, Mukul Gandhi |
RE: [xsl] Fwd: Combing two differen, cknell | Date | [xsl] XSLT compiler, Mohsen Saboorian |
Month |