我试图通过使用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?
答案 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)