use Test;
BEGIN { plan tests => 35 }
use XML::LibXSLT;
{
my $parser = XML::LibXML->new();
my $xslt = XML::LibXSLT->new();
ok($parser); ok($xslt);
$xslt->register_function('urn:foo' => 'test', sub { ok(1); defined $_[1] ? return $_[0] . $_[1] : return $_[0] });
$xslt->register_function('urn:foo' => 'test2', sub { ok(ref($_[0]), 'XML::LibXML::NodeList'); ref($_[0]) });
$xslt->register_function('urn:foo' => 'test3', sub { ok(@_ == 0); return; });
my $source = $parser->parse_string(<<'EOT');
EOT
my $style = $parser->parse_string(<<'EOT');
(( ))
(( ))
[[ ]]
[[ ]]
(( ))
(( ))
EOT
ok($style);
my $stylesheet = $xslt->parse_stylesheet($style);
my $results = $stylesheet->transform($source);
ok($results);
ok($stylesheet->output_string($results), qr(Foo!));
ok($stylesheet->output_string($results), qr(NodeList));
$xslt->register_function('urn:foo' => 'get_list', \&get_nodelist );
our @words = qw( one two three );
sub get_nodelist {
my $nl = XML::LibXML::NodeList->new();
$nl -> push( map { XML::LibXML::Text->new($_) } @words );
return $nl;
}
$style = $parser->parse_string(<<'EOT');
EOT
ok($style);
$stylesheet = $xslt->parse_stylesheet($style);
for (1..5) {
$results = $stylesheet->transform($source);
ok($results);
ok($stylesheet->output_string($results), qr(
one));
ok($stylesheet->output_string($results), qr(onetwothree));
}
}
{
# testcase by Elizabeth Mattijsen
my $parser = XML::LibXML->new;
my $xsltproc = XML::LibXSLT->new;
my $xml = $parser->parse_string( <<'XML' );
XML
my $xslt = $parser->parse_string( <<'XSLT' );
XSLT
my $aux = <<'XML';
1st
2nd
XML
{
XML::LibXSLT->register_function(
('http://foo', 'custom') => sub { $parser->parse_string( $aux )->findnodes('//y') }
);
my $stylesheet = $xsltproc->parse_stylesheet($xslt);
my $result = $stylesheet->transform($xml);
# the behavior has changed in some version of libxslt
my $expect = qq(
1st2nd1st\n);
ok ($result->serialize,qr{(\Q\n\E)?\Q$expect\E});
}
{
XML::LibXSLT->register_function(
('http://foo', 'custom') => sub { $parser->parse_string( $aux )->findnodes('//y')->[0]; });
my $stylesheet = $xsltproc->parse_stylesheet($xslt);
my $result = $stylesheet->transform($xml);
my $expect = qq(