2013-07-02 143 views
3

假设我们具有这样的结构(的b在每a数是未知的):选择最前N个元素

<a> 
    <b/> 
    <b/> 
    <b/> 
</a> 
<a> 
    <b/> 
    <b/> 
    <b/> 
</a> 

我们如何表达的xpath以下短语:“嵌套成上层4b中的元素“

a/b[position() <= 4]由于显而易见的原因返回全部6个元素。

我该如何将它限制为4?

我发现(a/b)[position() <= 4]应该可以工作,但似乎是xpath 2.0。任何想法1.0版本?

回答

2

为什么这么说

(A/B)位置()< = 4]应该工作,但似乎它的XPath 2.0

?这是完全合法的XPath 1.0,实际上这是一个常见的习惯用法。我只是测试它,以确认它被接受并正常工作。

它也可能比使用count(preceding::b)更高效,这取决于XPath处理器。

+0

嗯,我用PHP DOM XPath试了一下,它说表达式是错误的。所以一旦它只支持1.0,我认为语法不是1.0 – zerkms

+0

现在再次检查它,现在它工作。感觉很蠢:-S – zerkms

+0

@zerkms::-)有时候会发生在我身上...... – LarsH

4

不是很漂亮,但是这会检查文档中早些时候有多少个<b>

a/b[count(preceding::b) < 4] 

这并不完美。如果其他<b>不在<a>之内,则会失败。例如:

<b>oops</b> 
<a> 
    <b/> 
    <b/> 
    <b/> 
</a> 
<a> 
    <b/> 
    <b/> 
    <b/> 
</a> 

这个不会被<b>oops</b>元素绊倒。

a/b[count(preceding::b/parent::a) < 4] 
+0

就是这样,谢谢 – zerkms