Inquiry: Reordering XML elements through XSL

James Clark jjc at jclark.com
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="http://www.w3.org/XSL/Transform/1.0"
>                 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

In XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
                indent-result="yes">
<xsl:template match="test">
 <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])"/>
   </xsl:for-each>
 </test>
</xsl:template>
</xsl:stylesheet>

James


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





More information about the Xml-dev mailing list