我有一个包含属性book
的项目.id
的XML文档,例如.id 'bk100', 'bk102', 'bk105', 'bk112', 'bk130'
。我想创建一个只返回满足这个条件的项的xpath:
.id > 'bk104'
那应该返回带有。'bk105', 'bk112', 'bk130'
的项目。我有这个:
xpath("//book[@id>'bk112']");
但它似乎没有做到这一点。是否有任何修改器可以实现这一点,还是我必须手动实现?
答案 0 :(得分:3)
在XPath 2中添加了compare function,遗憾的是它不可用。
使用DOM extension,register PHP functions for use in XPath expressions和strcmp可以解决问题。
$xml = <<<'XML'
<books>
<book id="bk100"/>
<book id="bk102"/>
<book id="bk105"/>
<book id="bk112"/>
<book id="bk130"/>
</books>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$xpath->registerPhpFunctions('strcmp');
$xpath->registerNamespace("php", "http://php.net/xpath");
foreach ($xpath->query("//book[php:functionString('strcmp', @id, 'bk104') > 0]") as $node) {
echo $dom->saveXML($node), "\n";
}
<book id="bk105"/>
<book id="bk112"/>
<book id="bk130"/>
否则你需要手动实现它。
答案 1 :(得分:1)
如果您有常量ID前缀
BK
您可以使用标准xpath函数 substring (从id中提取数字)和数字(将字符串转换为数字)来缓解此问题,如下所示:
xpath('//book[number(substring(@id, 3))>104]'))