我想限制从 xpath 查询收到的结果数量。
例如:-
$info = $xml->xpath("//*[firstname='Sheila'] **LIMIT 0,100**");
你看LIMIT 0,100
。
你应该可以使用"//*[firstname='Sheila' and position() <= 100]
“
编辑:
给定以下 XML:
<root>
<country.php desc="country.php" language="fr|pt|en|in" editable="Yes">
<en/>
<in>
<cityList desc="cityList" language="in" editable="Yes" type="Array" index="No">
<element0>Abu</element0>
<element1>Agartala</element1>
<element2>Agra</element2>
<element3>Ahmedabad</element3>
<element4> Ahmednagar</element4>
<element5>Aizwal</element5>
<element150>abcd</element150>
</cityList>
</in>
</country.php>
</root>
您可以使用以下 XPath 获取前三个城市:
//cityList/*[position()<=3]
结果:
Node element0 Abu
Node element1 Agartala
Node element2 Agra
如果要将其限制为以 开头的节点element
:
//cityList/*[substring(name(), 1, 7) = 'element' and position()<=3]
请注意,后一个示例有效,因为您正在选择cityList 的所有子节点,因此在这种情况下Position()
可以按预期限制结果。如果 cityList 节点下混合有其他节点名称,您会得到不希望的结果。
例如,如下更改 XML:
<root>
<country.php desc="country.php" language="fr|pt|en|in" editable="Yes">
<en/>
<in>
<cityList desc="cityList" language="in" editable="Yes" type="Array" index="No">
<element0>Abu</element0>
<dog>Agartala</dog>
<cat>Agra</cat>
<element3>Ahmedabad</element3>
<element4> Ahmednagar</element4>
<element5>Aizwal</element5>
<element150>abcd</element150>
</cityList>
</in>
</country.php>
</root>
并使用上面的 XPath 表达式,我们现在得到
Node element0 Abu
请注意,我们丢失了第二个和第三个结果,因为该position()
函数正在以更高的优先级进行评估 - 与请求“给我前三个节点,现在给我所有以 'element '”。
我自己也遇到了同样的问题,并且对 Geoffs 的回答有一些问题,因为正如他清楚地描述的那样,由于优先级,它限制了在执行查询的其他部分之前返回的元素数量。
我的解决方案是position() < 10
在应用我的其他条件后添加作为附加条件,例如:
//ElementsIWant[./ChildElementToFilterOn='ValueToSearchFor'][position() <= 10]/.
请注意,我使用了两个单独的条件块。这将首先过滤掉符合我条件的元素,其次只取其中的 10 个。