使用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]