[xsl] Moving elements during identity transformation

Subject: [xsl] Moving elements during identity transformation
From: Martynas Jusevicius <martynas.jusevicius@xxxxxxxxx>
Date: Wed, 1 Sep 2010 17:49:51 +0200
Hey list,

I'm doing an identity transformation which cleans up, filters and
moves around elements from my source document.

Let's say there is <ToC> anywhere in the document, and from there it
has to be moved directly *before* <Index> element, wherever that one
is.

What I'm doing is this:

        <xsl:template match="Index">
		<xsl:apply-templates select="/ToC"/> <!-- lets just say this selects ToC -->
		<xsl:copy>
                    <xsl:apply-templates select="@* | node()"/>
		</xsl:copy>
	</xsl:template>

So the <ToC> is now at its new location, but the old one has still to
be removed:

        <xsl:template match="ToC"/>

Now the problem is, this will also remove the new <ToC>. Since this is
a identity transformation, I don't want to use <xsl:copy-of>, as some
of the <ToC> descendants might also need processing.

What do you do in such situation?
The only thing I can think of is introducing some parameter like $keep
in the <ToC> template and then pass it from the <Index> template to
differentiate between the two cases.

Thanks,

Martynas
semantic-web.dk

Current Thread