1 # $Id: XPathContext.pm 422 2002-11-08 17:10:30Z phish $
3 # This is free software, you may use it and distribute it under the same terms as
6 # Copyright 2001-2003 AxKit.com Ltd., 2002-2006 Christian Glahn, 2006-2009 Petr Pajas
10 package XML::LibXML::XPathContext;
13 use vars qw($VERSION @ISA $USE_LIBXML_DATA_TYPES);
17 use XML::LibXML::NodeList;
19 $VERSION = "1.70"; # VERSION TEMPLATE: DO NOT CHANGE
21 # should LibXML XPath data types be used for simple objects
22 # when passing parameters to extension functions (default: no)
23 $USE_LIBXML_DATA_TYPES = 0;
28 my ($self, $xpath, $node) = @_;
30 my @nodes = $self->_guarded_find_call('_findnodes', $node, $xpath);
36 return XML::LibXML::NodeList->new(@nodes);
41 my ($self, $xpath, $node) = @_;
43 my ($type, @params) = $self->_guarded_find_call('_find', $node, $xpath,0);
46 return $type->new(@params);
52 my ($self, $xpath, $node) = @_;
53 my (undef, $value) = $self->_guarded_find_call('_find', $node, $xpath,1);
59 return $self->find(@_)->to_literal->value;
62 sub _guarded_find_call {
63 my ($self, $method, $node)=(shift,shift,shift);
67 $prev_node = $self->getContextNode();
68 $self->setContextNode($node);
72 @ret = $self->$method(@_);
74 $self->_free_node_pool;
75 $self->setContextNode($prev_node) if ref($node);
86 sub registerFunction {
87 my ($self, $name, $sub) = @_;
88 $self->registerFunctionNS($name, undef, $sub);
93 my ($self, $prefix) = @_;
94 $self->registerNs($prefix, undef);
98 sub unregisterFunction {
99 my ($self, $name) = @_;
100 $self->registerFunctionNS($name, undef, undef);
104 sub unregisterFunctionNS {
105 my ($self, $name, $ns) = @_;
106 $self->registerFunctionNS($name, $ns, undef);
110 sub unregisterVarLookupFunc {
112 $self->registerVarLookupFunc(undef, undef);
116 # extension function perl dispatcher
117 # borrowed from XML::LibXSLT
119 sub _perl_dispatcher {
126 my $type = shift(@params);
127 if ($type eq 'XML::LibXML::Literal' or
128 $type eq 'XML::LibXML::Number' or
129 $type eq 'XML::LibXML::Boolean')
131 my $val = shift(@params);
132 unshift(@perlParams, $USE_LIBXML_DATA_TYPES ? $type->new($val) : $val);
134 elsif ($type eq 'XML::LibXML::NodeList') {
135 my $node_count = shift(@params);
136 unshift(@perlParams, $type->new(splice(@params, 0, $node_count)));
140 $func = "main::$func" unless ref($func) || $func =~ /(.+)::/;
142 my $res = $func->(@perlParams);