use strict; use warnings; use XML::LibXML; use XML::LibXML::XPathContext; sub getObjAll { my ($topList, $actNode, $idNodeList, $expression, $value) = @_; my $top = $topList->[0]; $expression =~ s/:1:/'$value'/g; my $failed; foreach my $idNode (@{$idNodeList}) { my $id = $idNode->textContent; my $nodes = $top->findnodes("/objects/obj[id='$id' and $expression]"); return unless @{$nodes}; } return $idNodeList; }; my $dom = XML::LibXML->load_xml(location => 'foo.xml'); my $xc = XML::LibXML::XPathContext->new($dom); $xc->registerFunction('getObjAll', \&getObjAll); my @nodes = $xc->findnodes("/objects/obj[getObjAll(/, ., ./refs/id, " . "'./version=:1:', ./version)]"); foreach my $node (@nodes) { print $node->toString(1); print "\n"; }