If solve is user, I need the value of name (LINES).
if solve is imm and name is ARCH, I need the value of value (6M)
I tried in the following:
use strict;
use warnings;
use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file(...);
my $j = 0;
my @imm;
$imm[$j++] = $_->data
foreach
$doc->findnodes(
"//meters/meter"
."/name[../value[\@solve/string() = 'immediate']]"
."/text()");
Errors are
Possible unintended interpolation of @solve in string
Global symbol "@solve" requires explicit package name
Sample XML:
<rules>
<meters>
<meter>
<name>LINES</spirit:name>
<display>LINES</display>
<description>Specifies the number of lines</description>
<value
solve="user"
id="LINES"
order="11"
format="long"
dataType="integer"
min="2"
max="34">34</value>
</meter>
<meter>
<name>ARCH</name>
<display>Define ARCH</display>
<description>Define ARCH</description>
<value
format="string"
solve="imm"
id="ARCH"
>6M</value>
</meter>
</meters>
</rules>
<rules>
<meters>
<meter>
<name>LINES</spirit:name>
<display>LINES</display>
<description>Specifies the number of lines</description>
<value
solve="user"
id="LINES"
order="11"
format="long"
dataType="integer"
min="2"
max="34">34</value>
</meter>
<meter>
<name>ARCH</name>
<display>Define ARCH</display>
<description>Define ARCH</description>
<value
format="string"
solve="imm"
id="ARCH"
>6M</value>
</meter>
</meters>
</rules>
This works for me:
I made the following changes to your code:
/string()part from the XPath expression. It is invalid usage of a function as indicated by the error I got.solveisimmin your sample data, notimmediate.BTW, changing the middle of the XPath expression to
avoids the need of the backslash.