如何在某个兄弟之后和另一个兄弟之前使用XPath明确地定位元素

时间:2018-01-17 10:39:01

标签: xpath

假设我有这样的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个元素?

1 个答案:

答案 0 :(得分:0)

您还没有说过您正在使用的XPath版本。 XPath 2.0引入了运算符(isintersect<<>>),这使得这很容易,例如你可以做($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中它更容易。