xsl-list
[Top] [All Lists]

Re: [xsl] Fwd: Combing two different documents

2006-07-17 03:27:26
On 7/17/06, andrew welch <andrew(_dot_)j(_dot_)welch(_at_)gmail(_dot_)com> 
wrote:
On 7/17/06, David B <daavidb(_at_)gmail(_dot_)com> 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

--~------------------------------------------------------------------
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>
--~--