[xml] Re: Problem with XML::LibXSLT Extension function returning nodelist.
- From: Mike Trotman <mike trotman datalucid com>
- To: perl-xml listserv ActiveState com
- Cc: xml gnome org
- Subject: [xml] Re: Problem with XML::LibXSLT Extension function returning nodelist.
- Date: Mon, 20 Jun 2005 17:59:28 +0100
Thanks Tod - that sounds like it should work.
The error messges made me think that maybe the node was getting garbage
collected twice,
but if returning a single node works then it must be something else.
Mike
Tod Harter wrote:
I just dealt with a fairly similar problem on Linux. The only minor
difference being instead of throwing an error LibXSLT just sat and ate
100% CPU forever on return from the callback.
I discovered a few things...
1. It makes no difference what the ownership of the elements is, they
can just as well be unowned element nodes etc.
2. Your nodelist returned from the callback MUST have exactly ONE
node! I only tried returning element nodes, but in my case as long as
I returned just one node things worked fine. That returned node can
itself have whatever children you want.
Once you get back to XSLT things should work Fine, ie something like
<xsl:copy-of select='myextprefix:myfunc()'/> should result in
inserting the one returned node and all its children.
There could be various possible reasons for these problems, maybe just
slightly broken bindings to perl (which it seems is a fairly common
issue with XML::LibXSLT...) or a namespace issue, or something to do
with ownership of the nodes (although playing with that never did seem
to help in my case).
Code like
my $df = XML::LibXML::NodeList->new();
my $e = XML::LibXML::Element->new('key');
$e->setAttribute('name','foobar');
$e->appendText('some text');
$df->push($e);
my $f = XML::LibXML::Element->new('key2');
$f->setAttribute('name2','foobar2');
$f->appendText('some text2');
$e->appendChild($f);
use Data::Dumper;
print "df is : ".Dumper($df)."\n";
return $df;
definitely works for me on Linux though at this point...
Mike Trotman wrote:
Hi.
I'm not sure if this is a Perl or libxml question.
I have an XSLT stylesheet which process multiple XML files.
I have added extension functions to lookup information (based on
attributes in the XML) from a different, constant XML file
and return a nodelist of additional information which is used in a
for-each loop in the XSLT.
This all works fine in Windows XP.
But under Linux - using variuous versions of libxml/libxslt - I get a
segmentation or memory fault error:
E.g.
Recoding from TM_OUT to CM_OUT
.*** glibc detected *** double free or corruption (fasttop):
0x08c787e8 ***
Aborted
If I set the extension functions to return an empty NodeList then I
get no errors
(but obviously not the output I want!).
I have also tried creating a new XML::LibXML::NodeList,
cloning each node found from the constant XML file,
setting the owner document to the current XML data
and pushing these nodes onto the new nodelist.
E.G.
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
my $dumndlist=XML::LibXML::NodeList->new();
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
my $fn_drgcombo= sub {
my $tandem_UID=shift || '""';
my $root=shift;
###return $dumndlist;
my $od=$root->get_node(0)->ownerDocument();
my $newl=XML::LibXML::NodeList->new();
my $nl=$drgcombo->findnodes('/DRGCOMBOLIST/item[ UID='.$tandem_UID.']');
for my $n ($nl->get_nodelist() ) {
my $nn=$n->cloneNode(1);
$nn->setOwnerDocument($od);
$newl->push($nn);
}
return $newl;
};
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
but I still get the memory error.
Any idea how to return a nodelist from an extension function in
XML::LibXSLT
(or is this a bug)?
Thanks
Mike Trotman
Message Scanned by ClamAV on datalucid.com
_______________________________________________
Perl-XML mailing list
Perl-XML listserv ActiveState com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
_______________________________________________
Perl-XML mailing list
Perl-XML listserv ActiveState com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
Message Scanned by ClamAV on datalucid.com
Message Scanned by ClamAV on datalucid.com
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]