XPath 1.0:替代使用偏执

XPath 1.0:替代使用偏执,xpath,Xpath,考虑以下XML: <A> <B /> </A> <A> <B /> </A> 如果我使用/A/B[2],将返回空集,因为在任何A下都没有第二个B。我需要的是告诉XPath处理器对前面的表达式求值并对结果应用谓词 我需要这样做的原因是,在构造XPath表达式时,我不知道前面和后面的部分(即,我无法放置一个开头)。目前,我只知道我想在表达式中附加/B,并对结果应用谓词。您应该使用以下方法: //A/B[@id=

考虑以下XML:

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

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

您应该使用以下方法:

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

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


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

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

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

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

不幸的是,实际文档中没有这样的id。我在这里使用它来轻松识别我需要选择的元素。不,它是一个内部部分,整个xml当然是格式良好的。XPath表达式的构造方式我不知道表达式的其他部分,正如我在问题中已经提到的。这就是为什么我试着寻找一些非偏执狂的东西。如果我知道表达式的前面部分,我就能够使用偏执狂作为一个更简单的解决方案。。
/A/B[count(.|(/A/B)[2])=1]