使用xpath获取节点的第N个子节点

93

我的样例输入XML如下:

<root>
 <a>
   <b>item</b>
   <b>item1</b>
   <b>item2</b>
   <b>item3</b>
   <b>item4</b>
 </a>
</root>

我应该选择一个节点 b,其位置的值是一个变量。

如何使用变量的值来测试节点的位置?

2个回答

118

22
记住它不是从0开始索引的。我刚花了两个小时在位置0上寻找某件事,浪费了我的时间。 - citizen conn

69

以下代码应该可以运行:

/root/a/b[2]

如果这样不行,尝试:

/root/a/b[position()=2]

2
我来这里是为了找出它们两者之间的区别,您能否解释一下它们的不同之处? - Andre
14
position()指的是在DOM中的位置。[2]指的是结果列表中的第二个结果。 - Becky Conning
2
@Andre。当在for-each循环的select语句中使用时,它们是相同的。当position()在循环本身中使用时,它指的是结果集。[n]格式之所以有效,是因为它是[ ]块内唯一的条件语句,否则必须使用position(),例如//a[(@id="xx") and (position()=3)],这表示“任何具有id为xx的第五个链接”。 - Patanjali
@Patanjali 这很令人困惑 - 位置为3的链接是第5个链接?在我看来,[2]可以代替:nth-of-type(2),而[position()=2]则相当于:nth-child(2)。我猜我们需要一些例子来澄清这个问题。 - bitoolean
1
@BeckyConning 它们是完全相同的东西。请参阅 https://www.w3.org/TR/1999/REC-xpath-19991116/#predicates:通过评估 Expr 并将结果转换为布尔值来评估 PredicateExpr。如果结果是数字,则如果该数字等于上下文位置,则结果将转换为 true,否则将转换为 false;如果结果不是数字,则结果将被转换为调用布尔函数一样。因此,位置路径 para[3] 等同于 para[position()=3]。 - SleepyBag
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接