Revision: 101 Author: matt Date: 2006-08-17 14:57:07 +0000 (Thu, 17 Aug 2006)
Log Message: ----------- Chained transformations added to the docs Made continuation lines work in config Modified Paths: -------------- trunk/MANIFEST trunk/lib/AxKit2/Config.pm trunk/lib/AxKit2/Docs/WritingPlugins.pod Modified: trunk/MANIFEST =================================================================== --- trunk/MANIFEST 2006-08-16 21:49:31 UTC (rev 100) +++ trunk/MANIFEST 2006-08-17 14:57:07 UTC (rev 101) @@ -94,3 +94,4 @@ plugins/stats plugins/uri_to_file TODO.txt +META.yml Module meta-data (added by MakeMaker) Modified: trunk/lib/AxKit2/Config.pm =================================================================== --- trunk/lib/AxKit2/Config.pm 2006-08-16 21:49:31 UTC (rev 100) +++ trunk/lib/AxKit2/Config.pm 2006-08-17 14:57:07 UTC (rev 101) @@ -140,6 +140,12 @@ chomp; + if (s/\\$//) { + # continuation line... + my $line = $_; + $_ = $line . $self->_configline; + } + return $_; } } Modified: trunk/lib/AxKit2/Docs/WritingPlugins.pod =================================================================== --- trunk/lib/AxKit2/Docs/WritingPlugins.pod 2006-08-16 21:49:31 UTC (rev 100) +++ trunk/lib/AxKit2/Docs/WritingPlugins.pod 2006-08-17 14:57:07 UTC (rev 101) @@ -238,11 +238,9 @@ sub hook_xmlresponse { my ($self, $input) = @_; - $self->log(LOGDEBUG, "Serving up a file"); my $stylesheet = $self->get_style; - my $out = $input->transform(XSLT($stylesheet)); return OK, $out; @@ -254,8 +252,84 @@ -=head1 Multiple Transformations +=head1 Chained Transformations +One of the powerful features of AxKit was always being able to easily chain +transformations together, this makes complex XSLT transformations much simpler, +among other benefits. + +Lets modify our plugin to support multiple XSLT transformations. + +The simplest way to do this is to modify our C<XSLT_Style> directive to support +multiple values, each value being a new XSLT stylesheet. First lets modify our +configuration to detail what we want: + + XSLT_Style myfirstplugin/stylesheets/sort.xsl \ + myfirstplugin/stylesheets/default.xsl + +The idea here being that one XSLT will sort our dromedaries, and the second will +turn them into HTML. + +Lets create our F<sort.xsl> file first: + + <?xml version="1.0" encoding="ISO-8859-1" ?> + <xsl:stylesheet + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0"> + + <xsl:template match="dromedaries"> + <dromedaries> + <xsl:apply-templates select="species"> + <xsl:sort select="@name"/> + </xsl:apply-templates> + </dromedaries> + </xsl:template> + + <!-- Identity Template --> + <xsl:template match="*|@*"> + <xsl:copy> + <xsl:copy-of select="@*"/> + <xsl:apply-templates/> + </xsl:copy> + </xsl:template> + </xsl:stylesheet> + +Note the use of the identity template. If you haven't used XSLT before take +note of that - it's a very useful template for debugging. + +So now we need to store a list of XSLT stylesheets in our config, and make use +of a list in the C<< ->transform() >> method. + +The nice thing about C<register_config> is that it automatically copes with +multi-valued configuration. All we need to do is cope with storing multiple +values. So we change our C<set_style> sub as follows: + + sub set_style { + my ($self, $config, @styles) = @_; + my $key = $self->plugin_name . '::style'; + $config->notes($key, [EMAIL PROTECTED]); + } + +So rather than taking a single value we take an array and store a reference to +that array. + +We don't need to change C<get_style> as that still returns the right "key" - we +just need to modify our expectations when we call C<get_style>: + + sub hook_xmlresponse { + my ($self, $input) = @_; + $self->log(LOGDEBUG, "Serving up a file"); + + my $stylesheets = $self->get_style; + my $out = $input->transform(map XSLT($_), @$stylesheets); + + return OK, $out; + } + +So instead of running C<XSLT()> once, we map it over C<@$stylesheets>. + +And that's it. Restart AxKit and make sure this returns a table of sorted results. + =head1 Caching =head1 What Are the APIs?