XPath 1.0:替换使用括号

时间:2012-02-10 16:46:33

标签: xpath

考虑以下XML:

<A>
  <B />
</A>
<A>
  <B />
</A>

有没有办法避免在此XPath 1.0表达式中使用parantheses来获取第二个B元素?

(/A/B)[2]

如果我使用/ A / B [2],则返回空集,因为任何A下都没有第二个B.我需要的是告诉XPath处理器评估前面的表达式并将谓词应用于结果

我需要这个的原因是,在构建XPath表达式时,我不知道前面和后面的部分(即我无法放置一个开头的paranthesis)。目前,我只知道我想将/ B附加到表达式并将结果应用于结果。

3 个答案:

答案 0 :(得分:1)

此XML格式不正确 - 它应该只有一个根。让我们假装顶部有<R>

您现在可以搜索/R/A[2]/B以获得第二个B.但是一旦您拥有/R/A,唯一可能的方法是将整个表达式括在括号中并添加B[2]。为什么将括号放在最开始是一个问题?

答案 1 :(得分:1)

以下内容仍然使用括号,但仅在谓词过滤器内部,因此您可以在构建XPath时附加它:

/A/B[count(.|(/A/B)[2])=1]

它使用Kaysian technique来设置差异。如果当前节点相同,则当前节点的并集计数和第二个/A/B的选择将为1。

答案 2 :(得分:0)

你应该用这个:

    //A/B[@id='2']