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