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(
  • one
  • two
  • three
  • )); } } { # 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(1st2nd\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(1st\n); ok ($result->serialize,qr{(\Q\n\E)?\Q$expect\E}); } } { my $parser = XML::LibXML->new; my $xsltproc = XML::LibXSLT->new; my $xslt = $parser->parse_string( <<'XSLT' ); XSLT $xsltproc->register_function( ("http://x/x", 'test') => sub { $_[0][0]->findnodes('//b[parent::a]') } ); my $stylesheet = $xsltproc->parse_stylesheet($xslt); my $result = $stylesheet->transform($parser->parse_string( <<'XML' )); XML ok ($result->serialize,qq(\n\n)); } { my $callbackNS = "http://x/x"; my $p = XML::LibXML->new; my $xsltproc = XML::LibXSLT->new; $xsltproc->register_function( $callbackNS, "some_function", sub { my($format) = @_; return $format; } ); $xsltproc->register_function( $callbackNS, "some_function2", sub { my($format) = @_; return $format->[0]; } ); my $xsltdoc = $p->parse_string(<<'EOF'); , , , ; , , , ; EOF my $doc = $p->parse_string(<barzzz EOF my $stylesheet = $xsltproc->parse_stylesheet($xsltdoc); my $result = $stylesheet->transform($doc); my $val = $result->findvalue("/root"); ok($val); ok($val eq "foo,barzzz,bak,bar;foo,barzzz,bak,bar;barbakzzz") or print $stylesheet->output_as_bytes($result); }