|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: xsl, and different xml versions
Here's another way of achieving this, this one less intrusive on the main,
dispatching sytlesheet than an earlier post which had it explicitly choose
among different modes. This is xsl 1.0, and uses a [xalan] extension
function.
The crux of the approach is to use an imported-stylesheet-specific "property", to affect which stylesheet to apply. The specific technique used isn't a mechanism of my invention or discovery, rather something I read previously ... dunno where ... and mundanely adapted as my journeyman knowledge allows. To wit: 1) each imported stylesheet defines an unique namespace-uri, and a 'starter' template that matches only that uri. All other templates use a mode="..." unique to that stylesheet. See doca-xsl, doc-b.xsl below. 2) the main stylesheet magically determines the unique-uri of the imported stylesheet to apply. This may be by examining an attribute in the input document, using a passed-in stylesheet param, doing a lookup in a referenced xml document, etc. See doc.xsl below 3) the main stylesheet dynamically creates a node with namespace-uri set to that determined above. 4) the main stylesheet calls <apply-templates select="...node-from-above..."/>; this invokes the starter template of the wanted imported stylesheet. The main stylesheet also passes in the root node of the input doc, via a param, for further processing. 5) once the starter template matches, it continues processing the rest of the document via apply-templates, selecting the root param from above. This is illustrated below. the input document ( doc.xml ) ===== <doc> <foo/> <bar/> </doc> the main stylesteet( doc.xsl ): ===== <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan" > <xsl:import href="doc-a.xsl"/> <xsl:import href="doc-b.xsl"/> <xsl:output method="xml"/> <xsl:template match="/">
<!--
Assume we've determined a namespace-uri unique
to the xsl document to invoke. This may be an
attribute of the main xml document, may be passed
in as a stylesheet parameter, etc.
-->
<xsl:variable name="xsldoc-uri" select="'doca-uri'"/> <xsl:variable name="selector">
<xsl:element name="x" namespace="{$xsldoc-uri}"/>
</xsl:variable> <xsl:apply-templates select="xalan:nodeset($selector)//*">
<xsl:with-param name="root" select="/" />
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>an imported stylesheet (doc-a.xsl): ===== <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:doca="doca-uri" exclude-result-prefixes="doca" > <xsl:output method="xml" /> <xsl:template match="*[namespace-uri() = 'doca-uri']">
<xsl:param name="root" select="/.."/>
<xsl:apply-templates select="$root" mode="doca-uri"/>
</xsl:template> <xsl:template match="/" mode="doca-uri">
<doc>
<xsl:apply-templates mode="doca-uri"/>
</doc>
</xsl:template> <xsl:template match="foo" mode="doca-uri">
<foo v="a"/>
</xsl:template> <xsl:template match="bar" mode="doca-uri">
<bar v="a"/>
</xsl:template>
</xsl:stylesheet>an imported stylesheet( doc-b.xsl ): ===== <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:docb="docb-uri" exclude-result-prefixes="docb" > <xsl:output method="xml"/> <xsl:template match="*[namespace-uri() = 'docb-uri']">
<xsl:param name="root" select="/.."/>
<xsl:apply-templates select="$root" mode="docb-uri"/>
</xsl:template> <xsl:template match="/" mode="docb-uri">
<doc>
<xsl:apply-templates mode="docb-uri"/>
</doc>
</xsl:template> <xsl:template match="foo" mode="docb-uri">
<foo v="b"/>
</xsl:template> <xsl:template match="bar" mode="docb-uri">
<bar v="b"/>
</xsl:template>
</xsl:stylesheet>When the variable doc.xsl :: xsldoc-uri is set to 'doca-uri' the result is: <?xml version="1.0" encoding="UTF-8"?> <doc> <foo v="a"/> <bar v="a"/> </doc> and when set to 'docb-uri' <?xml version="1.0" encoding="UTF-8"?> <doc> <foo v="b"/> <bar v="b"/> </doc> Regards, --A From: Jake Briggs <jakbri@xxxxxxxxxxxxxx> Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: xsl, and different xml versions Date: Fri, 15 Apr 2005 14:27:34 +1200 _________________________________________________________________ FREE pop-up blocking with the new MSN Toolbar get it now! http://toolbar.msn.click-url.com/go/onm00200415ave/direct/01/
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








