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