xsl-list
[Top] [All Lists]

RE: Portability function-available tips

2004-01-09 03:17:59
Two other suggestions for how to tackle this:

(a) put the processor-dependent code in an external XML entity, and use
an EntityResolver to bring in the right version of the external entity
at stylesheet compile-time.

(b) write a processor-dependent stylesheet overlay that imports the main
logic of the stylesheet and overrides the processor-specific parts (for
example, the global variable "foo" in your example below). Use this
overlay as the nominated stylesheet for your transformation.

Michael Kay


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?

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

cheers
andrew

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



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