Generally speaking, you want to validate against a specific schema. For example, if you expect an Open Travel Alliance (OTA) request, you're going to validate against the schema for an OTA request. Or maybe you want to check that your own code generates a proper OTA request or response. Either way, you don't need xsi:schemaLocation. What this means is that ::Schema's interface is more than adequate for most people.
To validate against the schema mentioned within the XML doc, you will to extract the schema URL yourself from the XML doc yourself. This is a rather trivial thing to do. Something like:
my $xpc = XML::LibXML::XPathContext->new;
$xpc->registerNs( xsi => 'http://www.w3.org/2001/XMLSchema-instance' )
+;
my $doc = XML::LibXML->new->parse_XXX(...);
my $schema_loc = $xpc->findvalue('/*/@xsi:schemaLocation', $doc)
or die("...\n");
my ($schema_ns, $schema_url) = split(' ', $schema_loc);
defined($schema_url)
or die("...\n");
Which you'd simply follow up with
my $schema = XML::LibXML::Schema->new( location => $schema_url );
eval { $schema->validate($doc); 1 }
or die("...\n");
Seeking work! You can reach me at ikegami@adaelis.com