Subject: Re: [xsl] Alternative to except operator that preserves order? From: TW <zupftom@xxxxxxxxxxxxxx> Date: Tue, 10 Jan 2012 09:16:56 +0100 |
2012/1/10 Andrew Welch <andrew.j.welch@xxxxxxxxx>: > On 10 January 2012 07:23, TW <zupftom@xxxxxxxxxxxxxx> wrote: >> I'm processing a sorted sequence of elements, recursively eliminating >> elements that have already been processed. I'm using "except" for >> this purpose, but except destroys the order and returns the remaining >> elements in document order, so I have to re-sort them every time. Not >> so much of a problem because the sequences are not very large, but I >> wondered, whether in general there is a better idiom for preserving >> the pre-sorted order in situations like this. The archive didn't make >> me any wiser. > > Small, complete runnable code sample demonstrating the problem please. > It's really about the general problem of keeping the order of a sequence when removing items, not a specific problem. But here is an example. This stylesheet can be applied to itself: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template name="dummy"> <dummy x="a56"/> <dummy x="a-3"/> <dummy x="d52"/> <dummy x="d38"/> <dummy x="s21"/> <dummy x="b93"/> <dummy x="a1"/> <dummy x="d6"/> <dummy x="s4"/> <dummy x="d143"/> <dummy x="k89"/> <dummy x="s-23"/> <dummy x="d-6"/> </xsl:template> <xsl:template match="/"> <output> <xsl:call-template name="processSequence"> <xsl:with-param name="elements" select="//dummy" as="element()*"/> </xsl:call-template> </output> </xsl:template> <xsl:template name="processSequence"> <xsl:param name="elements" as="element()*"/> <xsl:variable name="elementSubset" as="element()*"> <xsl:call-template name="selectSomeElements"> <xsl:with-param name="elements" as="element()*"> <!-- At this point, the sequence has to be re-sorted every time because oder is destroyed by except below --> <xsl:perform-sort select="$elements"> <xsl:sort select="number(substring(@x,2))"/> </xsl:perform-sort> </xsl:with-param> </xsl:call-template> </xsl:variable> <xsl:variable name="remainingElements" select="$elements except $elementSubset"/> <xsl:for-each select="$elementSubset"> Do something <xsl:copy-of select="."/> </xsl:for-each> <xsl:if test="$remainingElements"> <xsl:call-template name="processSequence"> <xsl:with-param name="elements" select="$remainingElements"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="selectSomeElements"> <xsl:param name="elements" as="element()*"/> <!-- Bogus selection criterium, more complex recursive template oringially --> <xsl:sequence select="$elements[position() = (1,3)]"/> </xsl:template> </xsl:stylesheet>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Alternative to except ope, Andrew Welch | Thread | Re: [xsl] Alternative to except ope, David Carlisle |
Re: [xsl] Alternative to except ope, Andrew Welch | Date | Re: [xsl] Alternative to except ope, David Carlisle |
Month |