按字典顺序比较 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]'))
我有一个 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]'))