There was a thread a while ago about axkit: uri's not working withThe problem, as far as I can see, is in XML::LibXSLT not registering the correct callback routines. I wrote a patch (attached) to fix this. The patch is against the publicly released version, 1.57, the one you get from the CPAN.
various libxml/libxslt -perl versions.
Was there any solution to this, since i can't get it to work?
What does the patch do:
- keeps the callbacks' references in an inside-out object at the Perl level, so that each stylesheet can have its own callbacks (same as XML::LibXML's parsers do)
- instate the stylesheet's callbacks before performing the transformations, both at the Perl and C levels
Hope this helps, and maybe gets incorporated in 1.58...
-- Dakkar - <Mobilis in mobile> GPG public key fingerprint = A071 E618 DD2C 5901 9574 6FE2 40EA 9883 7519 3F88 key id = 0x75193F88
diff -ur XML-LibXSLT-1.57/LibXSLT.pm XML-LibXSLT-1.57-patched/LibXSLT.pm --- XML-LibXSLT-1.57/LibXSLT.pm Mon Mar 1 19:42:25 2004 +++ XML-LibXSLT-1.57-patched/LibXSLT.pm Mon Nov 8 09:57:56 2004 @@ -136,7 +136,9 @@ local $XML::LibXML::close_cb = $self->{XML_LIBXSLT_CLOSE}; #warn "localised callbacks: $XML::LibXML::match_cb $XML::LibXML::open_cb $XML::LibXML::read_cb $XML::LibXML::close_cb"; - $self->_parse_stylesheet(@_); + my $ret=$self->_parse_stylesheet(@_); + $XML::LibXSLT::Stylesheet::owner{$ret}=$self; + return $ret; } sub parse_stylesheet_file { @@ -151,13 +153,56 @@ local $XML::LibXML::close_cb = $self->{XML_LIBXSLT_CLOSE}; #warn "localised callbacks: $XML::LibXML::match_cb $XML::LibXML::open_cb $XML::LibXML::read_cb $XML::LibXML::close_cb"; - $self->_parse_stylesheet_file(@_); + my $ret=$self->_parse_stylesheet_file(@_); + $XML::LibXSLT::Stylesheet::owner{$ret}=$self; + return $ret; } sub register_xslt_module { my $self = shift; my $module = shift; # Not implemented +} + +package XML::LibXSLT::Stylesheet; + +our %owner; + +sub transform { + my $self = shift; + my $owner=$XML::LibXSLT::Stylesheet::owner{$self}; + if (!ref($owner) || !$owner->{XML_LIBXSLT_MATCH}) { + #warn "callbacks: $XML::LibXML::match_cb $XML::LibXML::open_cb $XML::LibXML::read_cb $XML::LibXML::close_cb"; + return $self->_transform(@_); + } + local $XML::LibXSLT::match_cb = $owner->{XML_LIBXSLT_MATCH}; + local $XML::LibXSLT::open_cb = $owner->{XML_LIBXSLT_OPEN}; + local $XML::LibXSLT::read_cb = $owner->{XML_LIBXSLT_READ}; + local $XML::LibXSLT::close_cb = $owner->{XML_LIBXSLT_CLOSE}; + + #warn "localised callbacks: $XML::LibXML::match_cb $XML::LibXML::open_cb $XML::LibXML::read_cb $XML::LibXML::close_cb"; + $self->_transform(@_); +} + +sub transform_file { + my $self = shift; + my $owner=$XML::LibXSLT::Stylesheet::owner{$self}; + if (!ref($owner) || !$owner->{XML_LIBXSLT_MATCH}) { + #warn "callbacks: $XML::LibXML::match_cb $XML::LibXML::open_cb $XML::LibXML::read_cb $XML::LibXML::close_cb"; + return $self->_transform_file(@_); + } + local $XML::LibXSLT::match_cb = $owner->{XML_LIBXSLT_MATCH}; + local $XML::LibXSLT::open_cb = $owner->{XML_LIBXSLT_OPEN}; + local $XML::LibXSLT::read_cb = $owner->{XML_LIBXSLT_READ}; + local $XML::LibXSLT::close_cb = $owner->{XML_LIBXSLT_CLOSE}; + + #warn "localised callbacks: $XML::LibXML::match_cb $XML::LibXML::open_cb $XML::LibXML::read_cb $XML::LibXML::close_cb"; + $self->_transform_file(@_); +} + +sub DESTROY { + delete $XML::LibXSLT::Stylesheet::owner{$_[0]}; + $_[0]->_DESTROY(); } 1; diff -ur XML-LibXSLT-1.57/LibXSLT.xs XML-LibXSLT-1.57-patched/LibXSLT.xs --- XML-LibXSLT-1.57/LibXSLT.xs Mon Mar 1 19:42:43 2004 +++ XML-LibXSLT-1.57-patched/LibXSLT.xs Mon Nov 8 10:04:40 2004 @@ -53,11 +53,6 @@ static SV * LibXSLT_debug_cb = NULL; static HV * LibXSLT_HV_allCallbacks = NULL; -static SV * LibXSLT_match_cb = NULL; -static SV * LibXSLT_read_cb = NULL; -static SV * LibXSLT_open_cb = NULL; -static SV * LibXSLT_close_cb = NULL; - int LibXSLT_input_match(char const * filename) { @@ -65,8 +60,9 @@ SV * global_cb; SV * callback = NULL; - if (LibXSLT_match_cb && SvTRUE(LibXSLT_match_cb)) { - callback = LibXSLT_match_cb; + if ((global_cb = perl_get_sv("XML::LibXSLT::match_cb", FALSE)) + && SvTRUE(global_cb)) { + callback = global_cb; } else if ((global_cb = perl_get_sv("XML::LibXML::match_cb", FALSE)) && SvTRUE(global_cb)) { @@ -123,8 +119,9 @@ SV * global_cb; SV * callback = NULL; - if (LibXSLT_open_cb && SvTRUE(LibXSLT_open_cb)) { - callback = LibXSLT_open_cb; + if ((global_cb = perl_get_sv("XML::LibXSLT::open_cb", FALSE)) + && SvTRUE(global_cb)) { + callback = global_cb; } else if ((global_cb = perl_get_sv("XML::LibXML::open_cb", FALSE)) && SvTRUE(global_cb)) { @@ -180,8 +177,9 @@ SV * callback = NULL; SV * ctxt = (SV *)context; - if (LibXSLT_read_cb && SvTRUE(LibXSLT_read_cb)) { - callback = LibXSLT_read_cb; + if ((global_cb = perl_get_sv("XML::LibXSLT::read_cb", FALSE)) + && SvTRUE(global_cb)) { + callback = global_cb; } else if ((global_cb = perl_get_sv("XML::LibXML::read_cb", FALSE)) && SvTRUE(global_cb)) { @@ -242,8 +240,9 @@ SV * callback = NULL; SV * ctxt = (SV *)context; - if (LibXSLT_close_cb && SvTRUE(LibXSLT_close_cb)) { - callback = LibXSLT_close_cb; + if ((global_cb = perl_get_sv("XML::LibXSLT::close_cb", FALSE)) + && SvTRUE(global_cb)) { + callback = global_cb; } else if ((global_cb = perl_get_sv("XML::LibXML::close_cb", FALSE)) && SvTRUE(global_cb)) { @@ -762,7 +761,7 @@ PROTOTYPES: DISABLE SV * -transform(self, sv_doc, ...) +_transform(self, sv_doc, ...) xsltStylesheetPtr self SV * sv_doc PREINIT: @@ -829,7 +828,7 @@ RETVAL SV * -transform_file(self, filename, ...) +_transform_file(self, filename, ...) xsltStylesheetPtr self char * filename PREINIT: @@ -860,7 +859,13 @@ else { xsltSetGenericDebugFunc(NULL, NULL); } + xmlRegisterInputCallbacks((xmlInputMatchCallback) LibXSLT_input_match, + (xmlInputOpenCallback) LibXSLT_input_open, + (xmlInputReadCallback) LibXSLT_input_read, + (xmlInputCloseCallback) LibXSLT_input_close); real_dom = xsltApplyStylesheet(self, xmlParseFile(filename), xslt_params); + xmlCleanupInputCallbacks(); + xmlRegisterDefaultInputCallbacks(); if (real_dom == NULL) { if (SvTRUE(ERRSV)) { croak("Error applying stylesheet: %s", SvPV(ERRSV, len)); @@ -879,7 +884,7 @@ RETVAL void -DESTROY(self) +_DESTROY(self) xsltStylesheetPtr self CODE: if (self == NULL) { Only in XML-LibXSLT-1.57-patched: Makefile Only in XML-LibXSLT-1.57-patched: xslt-callbacks.patch
signature.asc
Description: OpenPGP digital signature