diff options
Diffstat (limited to 'XPath/LocationPath.pm')
-rw-r--r-- | XPath/LocationPath.pm | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/XPath/LocationPath.pm b/XPath/LocationPath.pm new file mode 100644 index 0000000..eb483d6 --- /dev/null +++ b/XPath/LocationPath.pm @@ -0,0 +1,61 @@ +# $Id: LocationPath.pm,v 1.8 2001/03/16 11:10:08 matt Exp $ + +package XML::XPath::LocationPath; +use XML::XPath::Root; +use strict; + +sub new { + my $class = shift; + my $self = []; + bless $self, $class; +} + +sub as_string { + my $self = shift; + my $string; + for (my $i = 0; $i < @$self; $i++) { + $string .= $self->[$i]->as_string; + $string .= "/" if $self->[$i+1]; + } + return $string; +} + +sub as_xml { + my $self = shift; + my $string = "<LocationPath>\n"; + + for (my $i = 0; $i < @$self; $i++) { + $string .= $self->[$i]->as_xml; + } + + $string .= "</LocationPath>\n"; + return $string; +} + +sub set_root { + my $self = shift; + unshift @$self, XML::XPath::Root->new(); +} + +sub evaluate { + my $self = shift; + # context _MUST_ be a single node + my $context = shift; + die "No context" unless $context; + + # I _think_ this is how it should work :) + + my $nodeset = XML::XPath::NodeSet->new(); + $nodeset->push($context); + + foreach my $step (@$self) { + # For each step + # evaluate the step with the nodeset + my $pos = 1; + $nodeset = $step->evaluate($nodeset); + } + + return $nodeset; +} + +1; |