RE: [xsl] Fwd: Combing two different documents

Subject: RE: [xsl] Fwd: Combing two different documents
From: cknell@xxxxxxxxxx
Date: Mon, 17 Jul 2006 06:15:22 -0400
How much hard-coding is "too much"?

How much you have to hard code depends on how deep the structure is. At the point below which you want to combine, xsl:copy-of will produce a deep copy and you won't have to specify node names lower in the tree than up to that point.

Here is an untested set of templates that should merge the two.
=====================
<xsl:variable name="file2" select="document('file2.xml')" />

<xsl:template match="/">
 <xsl:apply-templates />
</xsl:template>

<xsl:template match="base">
 <xsl:apply-templates>
</xsl:template>

<xsl:template match="foo">
 <foo>
   <xsl:apply-templates />
   <xsl:apply-templates select="$file2/base/foo/*" />
 </foo>
</xsl:template>

<xsl:template match="foo/*">
 <xsl:copy-of select="*" />
</xsl:template>
--
Charles Knell
cknell@xxxxxxxxxx - email



-----Original Message-----
From:     David B <daavidb@xxxxxxxxx>
Sent:     Mon, 17 Jul 2006 10:56:50 +0100
To:       xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject:  [xsl] Fwd: Combing two different documents

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.

I thought I would run an xslt on file1, and then use the XSLTSL
xpath:node template to get the xpath of the current node, construct a
string like:
       <xsl:variable name="path2">
           <xsl:text>document('file1.xml')/</xsl:text>
           <xsl:value-of select="$path"/>
           <xsl:text>bar2</xsl:text>
       </xsl:variable>

And then get the contents of the element that xpath points to using:
<xsl:value-of select="$path2'"/>

But that just prints the contents of the variable $path2! I would like
to use evaluate($path2) but that's not in the xslt standard, so is
there any other way of achieving what I am trying to achieve?

/David

Current Thread