Frej Soya Rasmussen wrote:
There was a thread a while ago about axkit: uri's not working with
various libxml/libxslt -perl versions.


Was there any solution to this, since i can't get it to work?
The 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.

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

Attachment: signature.asc
Description: OpenPGP digital signature



Reply via email to