考虑以下XML:
<A>
<B />
</A>
<A>
<B />
</A>
有没有办法避免在此XPath 1.0表达式中使用parantheses来获取第二个B元素?
(/A/B)[2]
如果我使用/ A / B [2],则返回空集,因为任何A下都没有第二个B.我需要的是告诉XPath处理器评估前面的表达式并将谓词应用于结果
我需要这个的原因是,在构建XPath表达式时,我不知道前面和后面的部分(即我无法放置一个开头的paranthesis)。目前,我只知道我想将/ B附加到表达式并将结果应用于结果。
答案 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']