按字典顺序比较XPath中的两个字符串

时间:2015-03-17 21:24:53

标签: php xml xpath simplexml

我有一个包含属性book的项目.id的XML文档,例如.id 'bk100', 'bk102', 'bk105', 'bk112', 'bk130'。我想创建一个只返回满足这个条件的项的xpath:

.id > 'bk104'

那应该返回带有。'bk105', 'bk112', 'bk130'的项目。我有这个:

xpath("//book[@id>'bk112']");

但它似乎没有做到这一点。是否有任何修改器可以实现这一点,还是我必须手动实现?

2 个答案:

答案 0 :(得分:3)

在XPath 2中添加了compare function,遗憾的是它不可用。

使用DOM extensionregister PHP functions for use in XPath expressionsstrcmp可以解决问题。


实施例

$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]'))