[EMAIL PROTECTED] wrote:
My XSP, that should choose which XSL to use.:
Another possibility is to use *one* style sheet containing
all the templates and match on the document element to choose
the processing path.
For example, you want to use 2 style sheets:
1.xsl
<xsl:stylesheet ...>
<xsl:template match="foo">
...
</xsl:stylesheet>
2.xsl
<xsl:stylesheet ...>
<xsl:template match="bar">
...
</xsl:stylesheet>
First, add a mode to all templates to avoid name clashes, and
perhaps prefixes to global variables and parameters:
1.xsl
<xsl:stylesheet ...>
<xsl:template match="foo" mode="xsl1>
...
</xsl:stylesheet>
2.xsl
<xsl:stylesheet ...>
<xsl:template match="bar" mode="xsl2">
...
</xsl:stylesheet>
Make a stylesheet including all of the above and a document
element matching template to choose the further processing
path:
all.xsl:
<xsl:stylesheet ...>
<xsl:include href="1.xsl"/>
<xsl:include href="2.xsl"/>
<xsl:template match="/xsl1">
<xsl:apply-templates mode="xsl1"/>
</xsl:template>
<xsl:template match="/xsl2">
<xsl:apply-templates mode="xsl2"/>
</xsl:template>
</xsl:stylesheet>
Your XSP has simply to provide the appropriate document element.
I have absolutely no experience with XSP so I have to guess...
<xsp:page language="java"...>
<!-- Get the passed parameters (if there are any) -->
<xsp:logic>
int whichXSL;
...
// Now I want to choose the suitable XSL
if( whichXSL == 1)
</xsp:logic>
<xsl1>
<results>
logic to put data here
</results>
</xsl1>
<xsp:logic>
else if( whichXSL == 2)
</xsp:logic>
<xsl2>
<results>
logic to put data here
</results>
</xsl2>
<xsp:logic>
...
You'll have to rearrange your data generation a bit, of course.
If you don't want to do this, use a "marker element"
<xsp:page language="java"...>
<!-- Get the passed parameters (if there are any) -->
<results>
<xsp:logic>
int whichXSL;
...
// Now I want to choose the suitable XSL
if( whichXSL == 1)
</xsp:logic>
<xsl1/>
<xsp:logic>
else if( whichXSL == 2)
</xsp:logic>
<xsl2/>
<xsp:logic>
and in the XSL
<xsl:template match="/">
<xsl:apply-templates select=/results/*[1]"/>
</xsl:template>
<xsl:template match="/results/xsl1">
<xsl:apply-templates mode="xsl1"/>
</xsl:template>
<xsl:template match="/results/xsl2">
<xsl:apply-templates mode="xsl2"/>
</xsl:template>
The "marker element" must be the first child ot the results
element. There are ways to get around this, for example using
namespaces and matching
<xsl:apply-templates select=/results/*[namespace-uri()='uri:foo']"/>
HTH
J.Pietschmann
---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faq/index.html>
To unsubscribe, e-mail: <[EMAIL PROTECTED]>
For additional commands, e-mail: <[EMAIL PROTECTED]>