$xpath->query('/html[boolean(string(normalize-space(@xml:lang))) = "true"]')
通常上面的查询会起作用,但在这种情况下,xhtml 属性 xml:lang 中有冒号。将其替换为实体 &59; 也不行。
有什么建议么?
$xpath->query('/html[boolean(string(normalize-space(@xml:lang))) = "true"]')
通常上面的查询会起作用,但在这种情况下,xhtml 属性 xml:lang 中有冒号。将其替换为实体 &59; 也不行。
有什么建议么?
这不是一个完整的答案,但......
需要注意的重要一点是属性 xml:lang 中没有冒号。属性“lang”是“xml”命名空间,它并不完全相同。xml 命名空间(在某些方面)是“内置的”。
其次,我认为您可能的意思是:
'/html[boolean(string(normalize-space(@xml:lang))) = true()]'
因为真与假不是 xpath 中的字符串。
现在,我使用 XML::LibXML 在 perl 中运行了以下脚本,它工作得很好:
#!/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]'