繁体   English   中英

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

[英]Why does DOMXPath->evaluate() return false

我试图evaluate()使用DOMXPath对象及其评价()函数的输入的XPath。 但是,我得到了一些意外的结果。 在该示例中,两个XPath结构或多或少相同,不同之处在于@begin在无效的@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结构,您可以使用我的美化工具 -免责声明,我是该工具的作者。您可以在此处测试上述PHP代码。)

那么我的XPath有什么问题,还是我用错误的方式对其进行了评估? 如何评估这种XPath?

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

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

如果../node[@rel="hd" and @pt="n"]总是返回最多1个结果,或者如果只返回第一个项目,则返回多个项目,则您可以改用以下表达式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM