Php 为什么xPath以相反的顺序返回这些元素?

Php 为什么xPath以相反的顺序返回这些元素?,php,xpath,Php,Xpath,有人能告诉我为什么下面的xPath表达式会导致数组的顺序相反吗 /ReaderDetails/Reader[Pin = "2325" or Pin = "2421" or Pin = "2424"] 然后,当我执行一个foreach时,返回的数组首先提取2424的元素,然后是2421,最后是2325 这些PIN以逗号分隔的列表形式输入,并且需要按此顺序输入。如果您使用的是XPath 1.0(我假设您是,因为使用更高版本的人通常会提到这一事实),那么根据XPath规范,结果是一个节点集,而节点集

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

/ReaderDetails/Reader[Pin = "2325" or Pin = "2421" or Pin = "2424"]
然后,当我执行一个
foreach
时,返回的数组首先提取2424的元素,然后是2421,最后是2325

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

如果您使用的是XPath 1.0(我假设您是,因为使用更高版本的人通常会提到这一事实),那么根据XPath规范,结果是一个节点集,而节点集实际上是一组没有定义顺序的节点。然而,我所知道的所有实现都会按文档顺序返回节点集的结果,因为XSLT就是这样要求它们的,而且大多数XPath实现都是将XSLT作为一个重要用例来设计的。因此,
读卡器
元素很可能按照向前扫描文档时遇到的顺序返回

在XPath3.1中,可以通过编写

/ReaderDetails ! (Reader[Pin = "2325"], 
                  Reader[Pin = "2421"], 
                  Reader[Pin = "2424"])
或者(如果所需订单始终“按Pin编号排序”)

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


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

顺序来自文档,而不是XPath表达式
   sort(/ReaderDetails/Reader[Pin = ('2325', '2421', '2424'), (),
        function($r) {number($r!Pin})