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
