xsl-list
[Top] [All Lists]

[xsl] Merging multiple documents and combining their nodes

2007-06-13 06:08:55
Hi Everyone,

I'm starting with half a dozen files with identical top-level
structures, but with different child nodes.

For example:

file1.xml

<components>
    <component name="a" description="1">
         <childA>Value</childA>
         <childB>Value</childB>
    </component>
</components>

file2.xml

<components>
    <component name="b" description="2">
         <childC>Value</childC>
         <childD>Value</childD>
    </component>
</components>


file3.xml

<components>
    <component name="a" description="1">
         <childE>Value</childE>
         <childF>Value</childF>
    </component>
</components>

I'm trying to merge all of these files into a single file and combine
all of the child nodes for <component> elements with identical name
attributes.


So far, I've been able to merge the documents:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:output indent="yes"/>
        <xsl:param name="sources">file1.xml|file2.xml|file3.xml</xsl:param>
        <xsl:template match="/">
                <components>
                        <xsl:call-template name="loaddocuments"/>
                </components>
        </xsl:template>
        <xsl:template name="loaddocuments">
                <xsl:param name="string" select="concat($sources,'|')"/>
                <xsl:if test="substring-before($string,'|') != ''">
                        <xsl:apply-templates
select="document(substring-before($string,'|'))" mode="merge"/>
                </xsl:if>
                <xsl:if test="contains($string,'|')">
                        <xsl:call-template name="loaddocuments">
                                <xsl:with-param name="string" 
select="substring-after($string,'|')"/>
                        </xsl:call-template>
                </xsl:if>
        </xsl:template>
        <xsl:template match="/" mode="merge">
                <xsl:copy-of select="//component"/>
        </xsl:template>
</xsl:stylesheet>


But the output does not combine the <component> elements::

<components>
    <component name="a" description="1">
         ..
    </component>
    <component name="a" description="1">
         ..
    </component>
    <component name="b" description="1">
         ..
    </component>
</components>


So, then I tried following a few sets of instructions based on the
information on the "Document" page of Dave Pawson's site
(http://www.dpawson.co.uk/xsl/sect2/N2602.html) and elsewhere.
Specifically, I tried creating a master file to list each of my XML
files and then references this file in my stylesheet.

For example:

filenames_file.xml

<files>
        <file>file1.xml</file>
        <file>file2.xml</file>
        <file>file3.xml</file>
</files>


Stylesheet:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:output indent="yes"/>
        <xsl:variable name="mergedset"
select="document('filenames_file.xml')/components/component"/>
        <xsl:template match="/">
                <components>
                        <xsl:apply-templates select="$mergedset" 
mode="process"/>
                </components>
        </xsl:template>
        <xsl:template match="/" mode="process">
                <xsl:apply-templates select="//component/@name">
                        <xsl:sort select="@name"/>
                </xsl:apply-templates>
        </xsl:template>
</xsl:stylesheet>


My output only contained an empty <components/> element.

I've tried applying various combinations of instructions on the
"Document" page, and have referenced the W3.org page on the document()
function (http://www.w3.org/TR/xslt#document), but have been
unsuccessful in achieving the desired output.

I'd appreciate any suggestions.

Thanks,
Mark

--

Mark Peters
Senior Technical Writer
Saba Software

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