Re: [xsl] Merging multiple documents and combining their nodes

Subject: Re: [xsl] Merging multiple documents and combining their nodes
From: "Mark Peters" <flickrmeister@xxxxxxxxx>
Date: Thu, 14 Jun 2007 11:38:31 -0400
Thanks for the tip, Martin.

After adding a comma in the following line to clear up one final
error, I ran the stylesheet again without incident.

(<xsl:copy-of select="@*|key('c',@name)/*"/>

But there is no actual data in my output:

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns:exslt="http://exslt.org/common"/>

My input file (filenames_file.xml) references my three input XML docs:

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

The three input XML docs include data in the components/component nodes:

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

So, I can't figure out why my output contains no data.

Here is my current stylesheet (thanks to David and Martin):

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:exslt="http://exslt.org/common";>
	<xsl:output indent="yes"/>
	<xsl:template match="/">
		<xsl:variable name="temp">
			<components>
				<xsl:copy-of select="document(/files/file)/components/component"/>
			</components>
		</xsl:variable>
		<components>
			<xsl:for-each
select="exslt:node-set($temp)/components/component[generate-id()=generate-id(key('c',@name))]">
				<xsl:sort select="@name"/>
(<xsl:copy>
(<xsl:copy-of select="@*|key('c',@name)/*"/>
				</xsl:copy>)
                      </xsl:for-each>
		</components>
	</xsl:template>
	<xsl:key name="c" match="component" use="@name"/>
</xsl:stylesheet>


Does anyone see what is missing?


Thanks,
Mark


On 6/14/07, Martin Honnen <Martin.Honnen@xxxxxx> wrote:


There is a closing ')' missing, you need

exslt:node-set($temp)/components/component[generate-id()=generate-id(key('c',@name))]

Current Thread