1package XML::Schematron::XSLTProcessor;
2use Moose::Role;
3use namespace::autoclean;
4with 'XML::Schematron::Schema';
5
6has template_buffer => (
7    traits    => ['String'],
8    is          => 'rw',
9    isa         => 'Str',
10    default     => sub { return '' },
11    handles     => {
12          append_template     => 'append',
13          reset_template      => 'clear',
14    },
15
16);
17
18sub tests_to_xsl {
19    my $self = shift;
20    my $mode = 'M0';
21    my $ns = qq|xmlns:xsl="http://www.w3.org/1999/XSL/Transform"|;
22
23    $self->append_template(
24        qq|<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
25        <xsl:stylesheet $ns version="1.0">
26        <xsl:output method="text"/>
27        <xsl:template match="/">
28        <xsl:apply-templates select="/" mode="$mode"/>|
29    );
30
31
32    my $last_context_path = '';
33    my $priority = 4000;
34    foreach my $test ( $self->all_tests) {
35
36        if ($test->context ne $last_context_path) {
37             $self->append_template(
38                 qq|\n<xsl:apply-templates mode="$mode"/>\n|
39             ) unless $priority == 4000;
40
41             $self->append_template(
42                 sprintf(qq|</xsl:template>\n<xsl:template match="%s" priority="$priority" mode="$mode">|, $test->context)
43             );
44             $priority--;
45        }
46
47        $self->append_template( $test->as_xsl );
48
49        $last_context_path = $test->context;
50    }
51
52
53    $self->append_template(
54        qq|<xsl:apply-templates mode="$mode"/>\n</xsl:template>\n
55           <xsl:template match="text()" priority="-1" mode="M0"/>
56           </xsl:stylesheet>|
57    );
58}
59
60sub dump_xsl {
61    my $self = shift;
62    $self->tests_to_xsl;
63    return $self->template_buffer;
64}
65
661;