9

我想限制从 xpath 查询收到的结果数量。

例如:-

$info = $xml->xpath("//*[firstname='Sheila'] **LIMIT 0,100**"); 

你看LIMIT 0,100

4

2 回答 2

10

你应该可以使用"//*[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 '”。

于 2012-04-11T14:21:23.907 回答
3

我自己也遇到了同样的问题,并且对 Geoffs 的回答有一些问题,因为正如他清楚地描述的那样,由于优先级,它限制了在执行查询的其他部分之前返回的元素数量。

我的解决方案是position() < 10在应用我的其他条件后添加作为附加条件,例如:

//ElementsIWant[./ChildElementToFilterOn='ValueToSearchFor'][position() <= 10]/.

请注意,我使用了两个单独的条件块。这将首先过滤掉符合我条件的元素,其次只取其中的 10 个。

于 2015-10-29T10:24:18.577 回答