findnodes
doesn't return a node. It returns a list of nodes or a ::NodeList. You could force it to return a list and take the first node returned.
for my $node ($d->findnodes('//data-table/data'))
{
my ($number_node) = $node->findnodes('number')
or next;
$number_node->textContent() eq '1'
or next;
my ($letter_text) = $node->findnodes('letter/text()')
or next;
$letter_text->setData('Purple');
}
(As you can see, I removed the pure noise usage of ./
.)
You could even use
for my $letter_text ($d->findnodes(
'//data-table/data[number/text()="1"]/letter/text()'))
{
$letter_text->setData('Purple');
}