假设我有这样的HTML结构:
//*[@title=''123]/../following-sibling::tr[@B][preceding-sibling::tr[@A]]
我想在第一部分找到所有元素,在/ title =" 123"之后但在/ title =" 456"之前。我不知道确切的数字' B'在第一部分中,它可能是150中的4个。
当我使用XPath表达式时:
componentDidUpdate(){
let o_s = this.state.letterArr.map((o) => {return o == 'X' ? 0 : o}).toString();
let x_x = this.state.letterArr.map((x) => {return x == 'O' ? 0 : x}).toString();
let oWin = (this.state.winArr.indexOf(o_s) != -1);
let xWin = (this.state.winArr.indexOf(x_x) != -1);
if( oWin == true ){
//confetti();
setTimeout(function(){
alert('O WINN!!!')
board(gameVar.mode, gameVar.letter)
}, 3000);
}else if( xWin == true ){
//confetti();
setTimeout(function(){
alert('X WINS!!!')
board(gameVar.mode, gameVar.letter)
}, 3000);
}
}
它返回我(在这个具体的例子中)6个元素,因为它们都满足上述条件。我怎样才能更具体,只找到第一个'部分中的4个元素?
答案 0 :(得分:0)
您还没有说过您正在使用的XPath版本。 XPath 2.0引入了运算符(is
,intersect
,<<
,>>
),这使得这很容易,例如你可以做($X/following-sibling::node() intersect $Y/preceding-sibling::node())
,首先绑定$ X和$ Y到终点。或者你可以做$X/following-sibling::node()[. << $Y]
。
在XPath 1.0中,您可以将P intersect Q
重写为P[count(.|Q) = 1]
,但效率可能不高!
为了提高效率,一旦达到终点,你真的想停止扫描下面的兄弟姐妹。不幸的是,即使在XPath 3.0中也难以实现,因为你不能编写递归函数:尽管在XQuery或XSLT中它更容易。