xsl-list
[Top] [All Lists]

RE: [xsl] General trick for re-applying recursivly/iteratively a XSLT Script until no changes? Preferable with XSLT v1.1

2009-12-04 08:20:41

If you are transforming using a "modified identity transform", then you
could make the identity template rule set an attribute changed="no", and
every other template rule that creates an element set changed="yes", and you
could then detect whether anything has changed using //@changed[.='yes'].

How you implement the "keep transforming until no change" depends rather on
the environment you are running in. You could do it of course using
recursion within the stylesheet itself:

<xsl:template match="/">
  <xsl:variable name="out">
    <xsl:apply-templates/>
  </xsl:variable>
  <xsl:choose>
    <xsl:when test="$out//@changed='yes'">
      <xsl:apply-templates select="$out"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy-of select="$out"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

In 2.0 an alternative would be do test deep-equal(/, $out).

In practice such repeated transformations arise in optimization scenarios -
see my paper at Extreme Markup 2007. It might be a good idea if this is your
application domain to look at the literature on "simulated annealing". 

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay 
 

-----Original Message-----
From: Wolfgang Laun [mailto:wolfgang(_dot_)laun(_at_)gmail(_dot_)com] 
Sent: 04 December 2009 12:41
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] General trick for re-applying 
recursivly/iteratively a XSLT Script until no changes? 
Preferable with XSLT v1.1

Simply comparing the size of the input and the output file 
(and calling the straightforward XSLT script over again) 
might do the trick for pruning; if you need to guard against 
replacment operations that might not change the size, cmp or 
diff would provide an indication of "no change".

-W

On Fri, Dec 4, 2009 at 10:48 AM, Andrew Welch 
<andrew(_dot_)j(_dot_)welch(_at_)gmail(_dot_)com> wrote:

2009/12/4 Ben Stover <bxstover(_at_)yahoo(_dot_)co(_dot_)uk>:
In general when I apply a XSLT script then one 
rule/template is matched at a time (for one node).
Then the XSLT script is stopped.

Imagine for example a template which deletes (only) the current 
leaves of an XML node tree. When the current leaves are 
removed then there are new leaves.

Is there a general (!) trick to re-apply the script on 
the resulting XML doc again?

Again: I am not searching for a specific solution but a general 
trick which works for (almost) all XSLT scripts. The processing 
should only stop with the re-application when there is no 
difference any more between input and output XML.

This general trick should preferably work with XSLT v1.1 
(if not possible then v2.0 is ok as well).


A couple of points here:

- XSLT 1.1 was dropped in favour of going straight to 2.0, 
so it's not 
clear why you would want 1.1?

- You've written a wordy description with no input/output 
examples, so 
it's hard to understand and even harder to give a precise reply



--
Andrew Welch
http://andrewjwelch.com
Kernow: http://kernowforsaxon.sf.net/


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--