summaryrefslogtreecommitdiff
path: root/XPath/LocationPath.pm
diff options
context:
space:
mode:
Diffstat (limited to 'XPath/LocationPath.pm')
-rw-r--r--XPath/LocationPath.pm61
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;