Inquiry: Reordering XML elements through XSL

James Clark jjc at
Sat Jun 19 05:10:51 BST 1999

"G. Ken Holman" wrote:

> >However, this still leaves the reverse problem of translating from a tag
> >order of AAABBB to ABABAB.

> <xsl:stylesheet xmlns:xsl=""
>                 indent-result="yes">
> <xsl:template match="/*">                       <!--document element-->
>   <xsl:copy>
>     <xsl:copy-of select="@*"/>                     <!--preserve atts-->
>     <xsl:call-template name="do-rest"/>
>   </xsl:copy>
> </xsl:template>
> <xsl:template name="do-rest">
>   <xsl:param-variable name="index" expr="1"/>   <!--init'd only once-->
>   <xsl:if test="//a[$index] | //b[$index]">
>     <xsl:copy-of select="//a[$index]"/>        <!--preserve elements-->
>     <xsl:copy-of select="//b[$index]"/>
>     <xsl:call-template name="do-rest">                   <!--recurse-->
>       <xsl:param name="index" expr="$index + 1"/>
>     </xsl:call-template>
>   </xsl:if>
> </xsl:template>
> </xsl:stylesheet>

A simpler approach is:

perform the following on the document element "test"
  for each a element
    copy the element
    let n be the position of this a element (ie this element is the n-th
a element)
    copy the n-th of the following b siblings


<xsl:stylesheet xmlns:xsl=""
<xsl:template match="test">
   <xsl:for-each select="a">
     <xsl:copy-of select="."/>
     <xsl:variable name="n" expr="position()"/>
     <xsl:copy-of select="from-following-siblings(b[$n])"/>


xml-dev: A list for W3C XML Developers. To post, mailto:xml-dev at
Archived as: and on CD-ROM/ISBN 981-02-3594-1
To (un)subscribe, mailto:majordomo at the following message;
(un)subscribe xml-dev
To subscribe to the digests, mailto:majordomo at the following message;
subscribe xml-dev-digest
List coordinator, Henry Rzepa (mailto:rzepa at

More information about the Xml-dev mailing list