如何使用XPath包含()在这里?
我正在尝试学习xpath。 我查看了这里的其他contains()例子,但没有使用AND运算符。 我无法得到这个工作:
//ul[@class='featureList' and contains(li, 'Model')]
上:
... <ul class="featureList"> <li><b>Type:</b> Clip Fan</li><li><b>Feature:</b> Air Moved: 65 ft. Amps: 1.1 Clip: Grips any surface up to 1.63" Plug: 3 prong grounded plug on heavy duty model Usage: Garage, Workshop, Dorm, Work-out room, Deck, Office & more.</li><li><b>Speed Setting:</b> 2 speeds</li><li><b>Color:</b> Black</li><li><b>Power Consumption:</b> 62 W</li><li><b>Height:</b> 14.5"</li><li><b>Width:</b> Grill Diameter: 9.5"</li><li><b>Length:</b> 11.5"</li> <li><b>Model #: </b>CR1-0081-06</li> <li><b>Item #: </b>N82E16896817007</li> <li><b>Return Policy: </b></li> </ul> ...
您只查看查询中的第一个li
子,而不查找可能包含文本'Model'
li
子元素。 你需要的是如下的查询:
//ul[@class='featureList' and ./li[contains(.,'Model')]]
这个查询会给你带有一个包含文本'Model'
一个或多个li
子元素的featureList
class
的元素。
我已经给杰夫·耶茨的解决scheme+1了。
这里有一个简单的解释,为什么你的方法不起作用。 这个:
// ul [@ class ='featureList'并包含(li,'Model')]
遇到contains()
函数(或XPath中的任何其他string函数)的限制。
第一个参数应该是一个string。 如果你给它一个节点列表(给它“ li
”这样做),一个string转换必须发生。 但是这个转换只对列表中的第一个节点完成。
在你的情况下,列表中的第一个节点是<li><b>Type:</b> Clip Fan</li>
(转换为string:“ Type: Clip Fan
”
// ul [@ class ='featureList'并包含(li,'Type')]
实际上会select一个节点!
这是一个关于关于contains()
在XPath中常见误解的老问题的新答案…
小结: contains()
表示包含一个子串 , 不 包含一个节点 。
详细说明
这个XPath经常被误解:
//ul[contains(li, 'Model')]
错误的解释:select那些包含一个li
元素和Model
ul
元素。
这是错误的,因为
-
contains(x,y)
期望x
是一个string,和 -
将多个元素转换为string的XPath规则是这样的 :
通过返回首先按照文档顺序的节点集中的节点的string值 ,将节点集转换为string。 如果节点集为空,则返回空string。
正确的解释:select那些第一个 li
孩子有一个包含 Model
子串的string值的 ul
元素。
例子
XML
<r> <ul id="one"> <li>Model A</li> <li>Foo</li> </ul> <ul id="two"> <li>Foo</li> <li>Model A</li> </ul> </r>
的XPath
-
//ul[contains(li, 'Model')]
selectone
ul
元素。注:
two
ul
元素没有被选中,因为two
ul
的第一个li
子元素的string值是Foo
,它不包含Model
子string。 -
//ul[li[contains(.,'Model')]]
selectone
和two
ul
元素。注意:两个
ul
元素都被选中,因为contains()
被单独应用于每个li
。 (因此,避免了棘手的多元素到string转换规则。)两个ul
元素都有一个li
子元素,其string值包含Model
子元素 –li
元素的位置不再重要。
也可以看看
- 在XPath中testingtext()节点与string值
在这里粘贴我contains
例子:
//table[contains(@class, "EC_result")]/tbody