【问题标题】:Comparing two strings in XPath lexicographically按字典顺序比较 XPath 中的两个字符串
【发布时间】:2015-03-17 21:24:52
【问题描述】:

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

.id > 'bk104'

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

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

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

【问题讨论】:

  • “词典”排序对于数学家来说是一回事,而对于词典编纂者来说则完全不同。但我不认为确切订单的细节是您在这里关心的。

标签: php xml xpath simplexml


【解决方案1】:

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

使用DOM extension,您可以使用register 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"/>

否则你需要手动实现它。

【讨论】:

    【解决方案2】:

    如果你有常量 id 前缀

    bk

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

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

    【讨论】:

    • 好吧,我认为这在字典上不起作用是对的吗?如果我有“bk104”>“xy104”,则结果为假,因为按字典顺序,“xy104”大于“bk104”。
    • 确定它的数值解决方案 - 正如我在上面写的,条件是所有 id 的相同常量前缀 (bk)(所以 id 的其余部分是数字)
    • 对,当然。好吧,不幸的是,情况并非如此。我想我必须手动实现它。谢谢你的时间。为创意点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2015-03-31
    • 2022-01-02
    相关资源
    最近更新 更多