Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Lenya Wiki" for change 
notification.

The following page has been changed by ThorstenScherler:
http://wiki.apache.org/lenya/MetaStylesheets

The comment on the change is:
bug 42882 - Moving MetaStylesheet to lenya wiki

New page:
=== Introduction ===

Meta stylesheets are stylesheets that generate other stylesheets. This 
technique is usually applied when you have an XML language whose behaviour can 
be implemented using an XSLT. A stylesheet can then transform this language 
into it's XSLT implementation.

Essentially it's a code generation mechanism: you have a ''little language'' 
that declaratively describes what you want to happen, a code generator in XSLT 
(the ''meta-stylesheet'') which transforms this language into the 
''implementation stylesheet''.

There are several examples of this:


 * For details on creating XSLT stylesheets that create other stylesheets, see 
[http://www.xml.com/pub/a/2003/11/05/xslt.html XML Reflection]
 *  Schematron -- an XML validation language implemented as XSLT, see 
[http://www.ldodds.com/papers/schematron_xsltuk.html Schematron - Validating 
XML using XSLT] for a tutorial
 *  Web template languages -- see the XML.com article 
[http://www.xml.com/pub/a/2002/03/27/templatexslt.html Template Languages in 
XSLT] for some relevant background

=== Overview ===

There are therefore two steps in using a meta-stylesheet:

1. Process your declarative processing description with the meta-stylesheet, 
generating the implementation stylesheet
2. Process your data with the implementation stylesheet, generating your output.

Here's how to do it in Cocoon. It's very easy!

''Note:'' '''It is recommended to use Xalan as opposed to XSLTC for the 
transformation.''' Xalan is the default for Cocoon 2.0.4. For 2.1 it must be 
specified by using {{{type="xalan"}}} in the {{{<map:transform>}}} node.

=== How It's Done ===

{{{
<map:pipeline>
<map:match pattern="my.html">
  <map:generate src="my.xml"/>
  <map:transform type="xalan" src="cocoon:/implementation-stylesheet.xsl"/>
  <map:serialize/>
</map:match>
</map:pipeline>

<map:pipeline>
<map:match pattern="implementation-stylesheet.xsl">
  <map:generate src="process-description.xml"/>
  <map:transform src="meta-stylesheet.xsl"/>
  <map:serialize type="xml"/>
</map:match>
</map:pipeline>
}}}

Here we have two pipelines, each of which perform one steps outline above. The 
first pipeline does the actual work: it transforms our XML into HTML results 
using the implementation stylesheet.

The implementation stylesheet is automatically generated by the second 
pipeline, which reads a processing description, transforms it with the 
meta-stylesheet generating the desired implementation.

Because the implementation stylesheet is generated automatically the 
meta-stylesheet can take into account additional context, e.g. the request 
parameters, when generating the results. This makes for very flexible 
processing.

-- LeighDodds

=== Issues ===

I ''have'' been able to get this working using the cocoon:/ protocol (using 
2.0.3), but I found that the dynamic stylesheets didn't appear to be cached, 
which was a big performance hit. StephenNg

I also ''have'' been able to get this working using the cocoon:/ protocol 
(using 2.1.1), but the 'transformed' xsl is not able to find any 'included' 
stylesheets. (seems logical, but it is annoying. Is there a solution?)

=== Note ===

Always be aware of the fact that such a pipeline is not cached. E.g., if you 
have a time-consuming generator (like HTML which uses JTidy), split the 
pipeline into two separate ones. Instead of
{{{
<map:match pattern="*.html">
  <map:generate src="{1}.html"/>
  <map:transform src="cocoon:/{1}.xsl"/>
  <map:serialize/>
</map:match>
}}}
use
{{{
<map:match pattern="*.html">
  <map:generate src="cocoon:/{1}.xml"/>
  <map:transform src="cocoon:/{1}.xsl"/>
  <map:serialize/>
</map:match>

<map:match pattern="*.xml">
  <map:generate src="{1}.html"/>
  <map:serialize type="xml"/>
</map:match>
}}}
In the latter case, the "*.xml" pipeline is cached and the overall performance 
is much better.

-- AndreasHartmann

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to