package XML::LibXSLT::EXSLT;
use strict;
use warnings;
use XML::LibXML;
use URI::Escape;
use Encode;
my $STRING_NS='http://exslt.org/strings';
my @funcs=(
[$STRING_NS,'split',\&estr_split],
[$STRING_NS,'encode-uri',\&estr_uri_escape],
);
sub apply_to {
my (undef,$xslt)=@_;
for my $f (@funcs) {
my ($ns,$name,$code)=@$f;
$xslt->register_function($ns,$name,$code);
}
return;
}
sub estr_split {
my ($string,$sep)=@_;
if (defined $sep) {
$sep="$sep";
}
else {
$sep=' ';
}
my @tokens=split /\Q$sep/,"$string";
my $doc=XML::LibXML::DocumentFragment->new();
for my $t (@tokens) {
my $e=XML::LibXML::Element->new('token');
$e->appendTextNode($t);
$doc->appendChild($e);
}
return $doc;
}
sub estr_uri_escape {
my ($string,$unsafe_mode,$encoding)=@_;
$encoding||='utf8';
my $unsafe=q{^a-zA-Z0-9\-_.!~*'()};
if (!$unsafe_mode) {
$unsafe.=q{;/?:@&=+\$,\[\]};
}
return uri_escape(encode($encoding,$string),$unsafe);
}
1;