RE: [xsl] Portability function-available tips

Subject: RE: [xsl] Portability function-available tips
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Fri, 9 Jan 2004 04:04:26 -0800 (PST)
> >  > Dimitre has a version of msxml that supports exsl,
> >  > alternatively I believe you can put in an msxsl script 
> >  > element that will be ignored by other processors but which 
> >  > implements exsl:node-set (essentially just needs to be an 
> >  > identity function)
> >  > 
> >  > David
> >  
> >  Ahhh excellent - exactly the kind of thing I was looking for, 
> >  thanks David
> 
> Hmmm, maybe it wasn't :)
> 
> Or at least, I can't see how to take advantage of it.
> 
> As an example, I currently build a temporary tree and convert it to a
> node-set: 
> 
> <xsl:variable name="foo-rtf"> 
>   <xsl:apply-templates mode="build"/> 
> </xsl:variable> 
> <xsl:variable name="foo" select="exsl:node-set($foo-rtf)"/> 
> 
> I then use that variable in several places by using:
> 
> <xsl:for-each select="$foo"> 
>   <xsl:apply-templates/> 
> </xsl:for-each> 
> 
> The only way I can see of making the stylesheet portable is to replace
> all occurances of the above for-each, with this choose/when:
> 
> <xsl:choose> 
>   <xsl:when test="function-available(msxml:node-set)"> 
>     <xsl:for-each select="msxml:node-set($foo-rtf)"> 
>       <xsl:call-template name="foo-template"/> 
>     </xsl:for-each> 
>   </xsl:when> 
>   <xsl:when test="function-available(exsl:node-set)"> 
>     <xsl:for-each select="exsl:node-set($foo-rtf)"> 
>       <xsl:call-template name="foo-template"/> 
>     </xsl:for-each> 
>   </xsl:when> 
>   <xsl:otherwise> 
>     <xsl:call-template name="error"/> 
>   </xsl:otherwise> 
> </xsl:choose> 
> 
> Not only that, but to avoid code duplication I need to separate out the
> body of the for-each into a named template - which is even more code.
> 
> How can I integrate the msxml:script idea to avoid using
> function-available?

This is simply not necessary -- just use exslt:node-set().

At present I am working with the following 9 XSLT processors all of which
implement exslt:node-set():

  MSXML4 (3rd party implementation -- download at:
                                      http://sf.net/projects/fxsl)

  .Net xsltTransform 
(3rd party implementation -- download at:
http://www.gotdotnet.com/Community/Workspaces/Workspace.aspx?id=201eb290-5bf0-4452-9bf7-d21d39268f36
)

  Saxon6.5.3

  Saxon 7.8

  JD

  XalanJ 2.4.1 and later

  XalanC 1.5

  xsltProc

  4xslt

These are just the 9 XSLT processors I'm working with on a daily basis.
Probably there are even more processors with EXSLT support.

> 
> (ps is this the way that everyone keeps there stylesheet portable?)

As noted above, just using exslt:node-set() is what allows me to develop
and support a single version of FXSL.


Dimitre Novatchev.
FXSL developer

http://fxsl.sourceforge.net/ -- the home of FXSL
Resume: http://fxsl.sf.net/DNovatchev/Resume/Res.html



__________________________________
Do you Yahoo!?
Yahoo! Hotjobs: Enter the "Signing Bonus" Sweepstakes
http://hotjobs.sweepstakes.yahoo.com/signingbonus

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread