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

Comparing two strings in XPath lexicographically

我有一个 XML 文档,其中的项目 book 具有属性 .id,例如 .id 'bk100', 'bk102', 'bk105', 'bk112', 'bk130'。我想创建一个 xpath,它将 return 只有那些满足此条件的项目:

.id > 'bk104'

应该有 return 个带有 .id 'bk105', 'bk112', 'bk130' 的项目。我有这个:

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

但这似乎并不能解决问题。是否有任何修改器可以实现此目的,还是我必须手动实现?

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

DOM extension you can register PHP functions for use in XPath expressions and 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"/>

否则您需要手动实施。

如果你有常量id前缀

bk

您可以通过使用标准 xpath 函数 substring(从 id 中提取数字)和 number(将字符串转换为数字)来缓解此问题如下:

xpath('//book[number(substring(@id, 3))>104]'))