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: Wed, 13 Jun 2007 20:43:12 -0400
Hi David,

The first stylesheet doesn't seem to find my XML documents. (The
filenames_file.xml file and the XML documents it lists are in the same
folder as my stylesheet.)

The output is as follows:

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

I tried running the second stylesheet, but it returned the following error:

Expected ,, but found: ]

Unfortunately, I don't know enough about keys and variables to know
what's going on in this stylesheet. :-(


select="document(document('filenames_file.xml')/files/file)/components/component"/>

also, if filenames_file.xml is your main inut you don't need pull it in
again with document, just

select="document(/files/file)/components/component"/>

If I don't reference the filenames_file.xml document in the stylesheet, where would I reference it? In other words, how would the stylesheet know which XML files I want to include as input?

Thanks,
Mark


On 6/13/07, David Carlisle <davidc@xxxxxxxxx> wrote:



<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(document('filenames_file.xml')/files/file)/components/component"/> </components> </xsl:variable>

                <components>
                        <xsl:for-each select="exslt:node-set($temp)/components/component">
                                <xsl:sort select="@name"/>
                                        <name>
                                                <xsl:value-of select="@name"/>
                                        </name>
                                        ..
                        </xsl:for-each>
                </components>
        </xsl:template>

</xsl:styleseet>

will merge and sort the components. Replacing the xsl:sort by a grouping
idiom will finish the job, something like (untested>

<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(document('filenames_file.xml')/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:styleseet>

Current Thread