为什么 DOMXPath->evaluate() return false

Why does DOMXPath->evaluate() return false

我正在尝试 evaluate() 通过使用 DOMXPath 对象及其 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 -- disclaimer, I am the author of that tool. You can test the above PHP code here。)

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

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

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

如果 ../node[@rel="hd" and @pt="n"] 保证总是 return 至多 1 个结果,或者如果您只需要与第一个项目进行比较以防多个项目被 returned,那么您可以改用以下表达式:

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