[xsl] Follow path in source-xml according to another source-document

Subject: [xsl] Follow path in source-xml according to another source-document
From: christoph.naber@xxxxxxxxxxx
Date: Thu, 22 Nov 2007 17:57:23 +0100
Hello list,

I want to follow a path in a given source-document, which is a
"light"-version of another source document.

The used processor is xsltproc, but the stylesheet is intended to run on
Xalan so I have to use XSLT 1.0. The input-file-size will be up to 5 MB.

Example "light" input XML
<root>
        <elem1 id="one">
                <elem2 id="two">
                        <elem4 id="three_three" />
                </elem2>
                <elem3 id="six">
                        <elem5 id="seven" />
                </elem3>
        </elem1>
</root>

Example "large" input XML
<root>
        <elem1 id="one">
                <elem2 id="two">
                        <elem4 id="three_one" />
                        <elem4 id="three_two" />
                        <elem4 id="three_three">
                                Here is the data of three_three
                        </elem4>
                        <elem4 id="three_four" />
                </elem2>
                <elem3 id="four">
                        <elem5 id="five" />
                </elem3>
                <elem3 id="six">
                        <elem5 id="seven" >
                                Here is the data of seven
                        </elem5>
                </elem3>
                <elem3 id="eight">
                        <elem5 id="nine" />
                </elem3>
        </elem1>
</root>

Desired output:
Here is the data of three_three
Here is the data of seven

This is the stylesheet that I managed to write so far. But I have no idea
if this is the XSL-way to perform such a task.

<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
        xmlns:exsl="http://exslt.org/common";>
        <xsl:output method="xml" indent="yes"/>

        <xsl:param name="lightdoc" select="string('light.xml')" />

        <xsl:template match="/" >
                <xsl:apply-templates select="root" >
                        <xsl:with-param name="light"
select="document($lightdoc)/root" />
                </xsl:apply-templates>
        </xsl:template>


        <xsl:template match="node()" >
                <xsl:param name="light" />
                <xsl:variable name="large" select="current()" />

                <xsl:choose>
                        <!-- We dont want to match textnodes or
processing-instructions -->
                        <xsl:when test="count($light/*) > 0" >
                                <xsl:for-each select="$light/*">
                                        <!-- not sure if I have to use
node-set here -->
                                        <xsl:apply-templates
select="exsl:node-set($large)/node()[@id = current()/@id]" >
                                                <xsl:with-param
name="light" select="current()" />
                                        </xsl:apply-templates>
                                </xsl:for-each>
                        </xsl:when>
                        <xsl:otherwise>
                                <xsl:value-of select="$large/text()" />
                        </xsl:otherwise>
                </xsl:choose>

        </xsl:template>

</xsl:stylesheet>

Any insight, eg. search items would be appreciated.

Greetings
Christoph Naber

If you are not the addressee, please inform us immediately that you have
received this e-mail by mistake, and delete it. We thank you for your
support.

Current Thread