Subject: | mapped prefixes not matched if context is not at root |
XML-XPath version 1.13 on Windows XP SP2
ActiveStte perl v5.8.4 for MSWin32-x86-multi-thread
If I map a prefix to a namespace name and then search from the document root for a qualified name with that prefix, the search returns the expected node(s).
If I search from that point (i.e., context is at a node), then no results are returned unless I use the prefix used in the instance document.
The example code at the end is a modification of the example from bug report #7530, which seems related to this one.
Running the code results in the following for me
xpath expr: /ns1:AAA/ns3:DDD/name3:BBB val: Text From ns3:BBB
xpath expr: /ns1:AAA/ns3:DDD
found: ns3:DDD
in scope namespace: ns3 is uri:namespace3
name4:BBB: []
ns4:BBB: [Text from ns2:BBB]
name3:BBB: []
ns3:BBB: [Text From ns3:BBB]
EEE: [Text from EEE]
xpath expr: /name1:AAA/name3:DDD/name3:BBB val: Text From ns3:BBB
xpath expr: /name1:AAA/name3:DDD
found: ns3:DDD
in scope namespace: ns3 is uri:namespace3
name4:BBB: []
ns4:BBB: [Text from ns2:BBB]
name3:BBB: []
ns3:BBB: [Text From ns3:BBB]
EEE: [Text from EEE]
------------------------
use strict;
use XML::XPath;
my $xp = XML::XPath->new( ioref => *DATA);
$xp->set_namespace("name1","uri:namespace1");
$xp->set_namespace("name2","uri:namespace2");
$xp->set_namespace("name3","uri:namespace3");
$xp->set_namespace("name4","uri:namespace4");
# Entry 1: Use prefixes known to be in instance document
# Entry 2: Use prefix mapped above to namespace
my @items = qw[/ns1:AAA/ns3:DDD /name1:AAA/name3:DDD];
foreach my $item (@items) {
print "xpath expr: $item" . "/name3:BBB val: " . $xp->find($item . '/name3:BBB') . "\n";
print "xpath expr: $item \n";
my @nodes = $xp->findnodes($item);
foreach my $node (@nodes) {
print "\tfound: " . $node->getName . "\n";
my @nsps = $xp->findnodes('namespace::*', $node);
foreach my $nsp (@nsps) {
print "\t\tin scope namespace: " .$nsp->getPrefix . " is " . $nsp->getExpanded . "\n";
}
print "\t\tname4:BBB: [" . $node->findvalue('name4:BBB') . "]\n";
print "\t\tns4:BBB: [" . $node->findvalue('ns4:BBB') . "]\n";
print "\t\tname3:BBB: [" . $node->findvalue('name3:BBB') . "]\n";
print "\t\tns3:BBB: [" . $node->findvalue('ns3:BBB') . "]\n";
print "\t\tEEE: [" . $node->findvalue('EEE') . "]\n";
print "\n";
}
}
__DATA__
<ns1:AAA xmlns:ns1="uri:namespace1">
<ns1:BBB/>
<n2:CCC xmlns:ns2="uri:namespace2"/>
<ns1:BBB/>
<n2:CCC/>
<ns1:BBB/>
<!-- comment -->
<ns3:DDD xmlns:ns3="uri:namespace3">
<ns4:BBB xmlns:ns4="uri:namespace4">Text from ns2:BBB</ns4:BBB>
<ns3:BBB>Text From ns3:BBB</ns3:BBB>
<EEE>Text from EEE</EEE>
</ns3:DDD>
<n2:CCC/>
</ns1:AAA>