为什么DOMXPath-> evaluate()返回false

时间:2016-09-30 12:50:44

标签: php validation xpath domxpath

我试图通过使用DOMXPath对象及其evaluate()函数evaluate()输入XPath。但是,我得到了一些意想不到的结果。在该示例中,两个XPath结构或多或少相同,除了在无效的@begin中进行比较。但我不明白为什么这段代码无效。

<?php

$newDomObj = new DOMDocument;
$newXpathObj = new DOMXPath($newDomObj);

$xpathValid = '//node[@cat="smain" and node[@rel="su" and @pt="vnw"] and node[@rel="hd" and @pt="ww"] and node[@rel="predc" and @cat="np" and node[@rel="det" and @pt="lid"] and node[@rel="hd" and @pt="n"]]]';
$xpathInvalid = '//node[@cat="smain" and node[@rel="su" and @pt="vnw" and number(@begin) < ../node[@rel="hd" and @pt="ww"]/number(@begin)] and node[@rel="hd" and @pt="ww" and number(@begin) < ../node[@rel="predc" and @cat="np"]/node[@rel="det" and @pt="lid"]/number(@begin)] and node[@rel="predc" and @cat="np" and node[@rel="det" and @pt="lid" and number(@begin) < ../node[@rel="hd" and @pt="n"]/number(@begin)] and node[@rel="hd" and @pt="n"]]]';

$valid = ($newXpathObj->evaluate($xpathValid) === false) ? false : true;
$invalid = ($newXpathObj->evaluate($xpathInvalid) === false) ? false : true;

var_dump($valid);
var_dump($invalid);

输出

bool(true)
bool(false)

(注意,为了更好地检查给定的XPath结构,您可以使用my beautifier - 免责声明,我是该工具的作者。您可以测试上面的PHP代码here。)

那么我的XPath有什么问题,或者我是以错误的方式评估它?我该如何评估这种XPath?

1 个答案:

答案 0 :(得分:0)

那是因为第二个XPath的以下部分无效,因为XPath 1.0- DOMXPath支持 - 不支持在路径步骤中调用函数:

../node[@rel="hd" and @pt="n"]/number(@begin)]

如果保证../node[@rel="hd" and @pt="n"]始终返回最多1个结果,或者如果您只需要在返回多个项目时与第一个项目进行比较,那么您可以改为使用以下表达式:

number(../node[@rel="hd" and @pt="n"]/@begin)