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;