首页 > 解决方案 > 为什么 xPath 以相反的顺序返回这些元素?

问题描述

有人能告诉我为什么下面的 xPath 表达式会导致数组顺序相反吗?

/ReaderDetails/Reader[Pin = "2325" or Pin = "2421" or Pin = "2424"]

然后,当我执行 aforeach时,返回的数组首先拉取 2424 的元素,然后是 2421,最后是 2325。

这些 PIN 以逗号分隔的列表输入,并且需要按此顺序排列。

标签: phpxpath

解决方案


如果你在 XPath 1.0 中(我假设你是,因为使用更高版本的人通常会提到这个事实)然后根据 XPath 规范,结果是一个节点集,而一个节点集实际上是一组节点没有明确的顺序。但是,我所知道的所有实现都以文档顺序返回节点集的结果,因为这就是 XSLT 需要它们的方式,并且大多数 XPath 实现都是以 XSLT 作为重要用例来设计的。因此,Reader在向前扫描文档时,元素可能会按照它们遇到的顺序返回。

在 XPath 3.1 中,您可以通过编写以选定的顺序返回一系列节点

/ReaderDetails ! (Reader[Pin = "2325"], 
                  Reader[Pin = "2421"], 
                  Reader[Pin = "2424"])

或者也许(如果所需的顺序总是“按密码排序”),

   sort(/ReaderDetails/Reader[Pin = ('2325', '2421', '2424'), (),
        function($r) {number($r!Pin}) 

但要做到这一点,您需要安装不同的 XPath 引擎,例如 Saxon/C。

在 XPath 1.0 中不可能以非文档顺序返回节点序列,因为没有这样的数据类型。XPath 1.0 中唯一的集合数据类型是节点集,正如我所提到的,它没有规定的顺序。因此,您使用 XPath 1.0 的唯一选择是使用单独的 XPath 表达式一次检索一个节点,或者可能在调用应用程序中对节点进行排序。


推荐阅读