|
Subject: RE: [xsl] General trick for re-applying recursivly/iteratively a XSLT Script until no changes? Preferable with XSLT v1.1 From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 4 Dec 2009 13:20:09 -0000 |
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.laun@xxxxxxxxx]
> Sent: 04 December 2009 12:41
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> 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.j.welch@xxxxxxxxx> wrote:
> >
> > 2009/12/4 Ben Stover <bxstover@xxxxxxxxxxx>:
> > > 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/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] General trick for re-appl, Wolfgang Laun | Thread | [xsl] accessing xsl document root f, Jan Bilik |
| RE: [xsl] Group Techniques by xslt, Hermann Stamm-Wilbra | Date | [xsl] DTD validation with SVG graph, Ylvisaker, Steve |
| Month |