summaryrefslogtreecommitdiff
path: root/XPath/NodeSet.pm
diff options
context:
space:
mode:
Diffstat (limited to 'XPath/NodeSet.pm')
-rw-r--r--XPath/NodeSet.pm184
1 files changed, 184 insertions, 0 deletions
diff --git a/XPath/NodeSet.pm b/XPath/NodeSet.pm
new file mode 100644
index 0000000..f1955b2
--- /dev/null
+++ b/XPath/NodeSet.pm
@@ -0,0 +1,184 @@
+# $Id: NodeSet.pm,v 1.17 2002/04/24 13:06:08 matt Exp $
+
+package XML::XPath::NodeSet;
+use strict;
+
+use XML::XPath::Boolean;
+
+use overload
+ '""' => \&to_literal,
+ 'bool' => \&to_boolean,
+ ;
+
+sub new {
+ my $class = shift;
+ bless [], $class;
+}
+
+sub sort {
+ my $self = CORE::shift;
+ @$self = CORE::sort { $a->get_global_pos <=> $b->get_global_pos } @$self;
+ return $self;
+}
+
+sub pop {
+ my $self = CORE::shift;
+ CORE::pop @$self;
+}
+
+sub push {
+ my $self = CORE::shift;
+ my (@nodes) = @_;
+ CORE::push @$self, @nodes;
+}
+
+sub append {
+ my $self = CORE::shift;
+ my ($nodeset) = @_;
+ CORE::push @$self, $nodeset->get_nodelist;
+}
+
+sub shift {
+ my $self = CORE::shift;
+ CORE::shift @$self;
+}
+
+sub unshift {
+ my $self = CORE::shift;
+ my (@nodes) = @_;
+ CORE::unshift @$self, @nodes;
+}
+
+sub prepend {
+ my $self = CORE::shift;
+ my ($nodeset) = @_;
+ CORE::unshift @$self, $nodeset->get_nodelist;
+}
+
+sub size {
+ my $self = CORE::shift;
+ scalar @$self;
+}
+
+sub get_node { # uses array index starting at 1, not 0
+ my $self = CORE::shift;
+ my ($pos) = @_;
+ $self->[$pos - 1];
+}
+
+sub getRootNode {
+ my $self = CORE::shift;
+ return $self->[0]->getRootNode;
+}
+
+sub get_nodelist {
+ my $self = CORE::shift;
+ @$self;
+}
+
+sub to_boolean {
+ my $self = CORE::shift;
+ return (@$self > 0) ? XML::XPath::Boolean->True : XML::XPath::Boolean->False;
+}
+
+sub string_value {
+ my $self = CORE::shift;
+ return '' unless @$self;
+ return $self->[0]->string_value;
+}
+
+sub to_literal {
+ my $self = CORE::shift;
+ return XML::XPath::Literal->new(
+ join('', map { $_->string_value } @$self)
+ );
+}
+
+sub to_number {
+ my $self = CORE::shift;
+ return XML::XPath::Number->new(
+ $self->to_literal
+ );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::XPath::NodeSet - a list of XML document nodes
+
+=head1 DESCRIPTION
+
+An XML::XPath::NodeSet object contains an ordered list of nodes. The nodes
+each take the same format as described in L<XML::XPath::XMLParser>.
+
+=head1 SYNOPSIS
+
+ my $results = $xp->find('//someelement');
+ if (!$results->isa('XML::XPath::NodeSet')) {
+ print "Found $results\n";
+ exit;
+ }
+ foreach my $context ($results->get_nodelist) {
+ my $newresults = $xp->find('./other/element', $context);
+ ...
+ }
+
+=head1 API
+
+=head2 new()
+
+You will almost never have to create a new NodeSet object, as it is all
+done for you by XPath.
+
+=head2 get_nodelist()
+
+Returns a list of nodes. See L<XML::XPath::XMLParser> for the format of
+the nodes.
+
+=head2 string_value()
+
+Returns the string-value of the first node in the list.
+See the XPath specification for what "string-value" means.
+
+=head2 to_literal()
+
+Returns the concatenation of all the string-values of all
+the nodes in the list.
+
+=head2 get_node($pos)
+
+Returns the node at $pos. The node position in XPath is based at 1, not 0.
+
+=head2 size()
+
+Returns the number of nodes in the NodeSet.
+
+=head2 pop()
+
+Equivalent to perl's pop function.
+
+=head2 push(@nodes)
+
+Equivalent to perl's push function.
+
+=head2 append($nodeset)
+
+Given a nodeset, appends the list of nodes in $nodeset to the end of the
+current list.
+
+=head2 shift()
+
+Equivalent to perl's shift function.
+
+=head2 unshift(@nodes)
+
+Equivalent to perl's unshift function.
+
+=head2 prepend($nodeset)
+
+Given a nodeset, prepends the list of nodes in $nodeset to the front of
+the current list.
+
+=cut