【发布时间】:2012-04-11 14:13:33
【问题描述】:
我想限制从 xpath 查询收到的结果数。
例如:-
$info = $xml->xpath("//*[firstname='Sheila'] **LIMIT 0,100**");
你看到LIMIT 0,100。
【问题讨论】:
我想限制从 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 表达式,我们现在得到 p>
Node element0 Abu
请注意,我们丢失了第二个和第三个结果,因为 position() 函数正在以更高的优先级进行评估 - 与请求“给我前三个节点,现在给我所有以“元素”开头的节点”。
【讨论】:
<element1/> 更好的是<element num="1"/>。其次,cityList 中是否包含其他实体?如果没有,那应该很简单——我会更新我的答案。
我自己也遇到了同样的问题,并且对 Geoffs 的回答有一些问题,因为正如他清楚地描述的那样,由于优先级,它限制了在执行查询的其他部分之前返回的元素数量。
我的解决方案是在应用我的其他条件后添加position() < 10 作为附加条件,例如:
//ElementsIWant[./ChildElementToFilterOn='ValueToSearchFor'][position() <= 10]/.
请注意,我使用了两个单独的条件块。 这将首先过滤掉符合我条件的元素,其次只取其中的 10 个。
【讨论】: