Это не полный ответ, но ...
Важно отметить, что атрибут xml: lang не содержит двоеточия. Атрибут 'lang' является пространством имен 'xml', что не совсем одно и то же. Пространство имен xml (в некоторых отношениях) «встроено».
Во-вторых, я думаю, что вы, вероятно, имеете в виду:
'/html[boolean(string(normalize-space(@xml:lang))) = true()]'
, поскольку истина и ложь не являются строками в xpath.
Теперь я запустил следующий скрипт на Perl, используя XML :: LibXML, и он прекрасно работает:
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
my $parser = XML::LibXML->new;
my $xml = $parser->parse_file('test.html');
my ($node) = $xml->findnodes('/html[boolean(string(normalize-space(@xml:lang))) = true()]');
print $node->textContent, "\n";
используя это в качестве ввода:
<?xml version='1.0'?>
<html xml:lang='en-uk'>
<head><title>boo</title></head>
<body><p>boo</p></body>
</html>
Выводит ожидаемый результат ("boo\nboo
").
Интересно, используете ли вы парсер, который не полностью осведомлен о пространстве имен. Кроме того, что вы подразумеваете под «работами»? Вы пытаетесь выяснить, есть ли у элемента html атрибут xml: lang?
Если да, то, вероятно, это было бы лучше:
'/html[@xml:lang]'