使用XPath,如何根据文本内容和属性值来select一个节点?

鉴于这个XML:

<DocText> <WithQuads> <Page pageNumber="3"> <Word> July <Quad> <P1 X="84" Y="711.25" /> <P2 X="102.062" Y="711.25" /> <P3 X="102.062" Y="723.658" /> <P4 X="84.0" Y="723.658" /> </Quad> </Word> <Word> </Word> <Word> 30, <Quad> <P1 X="104.812" Y="711.25" /> <P2 X="118.562" Y="711.25" /> <P3 X="118.562" Y="723.658" /> <P4 X="104.812" Y="723.658" /> </Quad> </Word> </Page> </WithQuads> 

我想查找具有“July”文本和四/ P1 / X属性大于90的节点。因此,在这种情况下,它不应该返回任何匹配。 但是,如果我使用GT(>)或LT(<),我会得到第一个字元素的匹配。 如果我使用eq(=),我没有匹配。

所以:

 //Word[text()='July' and //P1[@X < 90]] 

将会如实返回真实

 //Word[text()='July' and //P1[@X > 90]] 

我如何在P1 @ X属性上正确地限制它?

另外,假设我有多个页面元素,用于不同的页码。 我怎样才能额外限制上面的search,findtext()='July', P1@X < 90 ,Page @pageNumber=3

通常我会考虑在XPath中使用前缀不正确的气味。

尝试这个:-

 /DocText/WithQuads/Page/Word[text()='July' and Quad/P1/@X > 90] 

你的问题是你使用//P1[@X < 90] ,它从文档的开头开始,开始search任何P1因此它总是成立的。 同样//P1[@X > 90]总是为真。

除了“//”问题之外,这个XML是混合内容的一个非常奇怪的用法。 如果任何子文本节点与7月完全相同,则谓词text()='July'将匹配该元素,由于周围的空白,在您的示例中这不是真的。 根据源XML的确切定义,我会去[text()[normalize-space(.)='July'] and Quad/P1/@X > 90]