我正在尝试学习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>
...
答案 0 :(得分:185)
您只查看查询中的第一个li
子项,而不是查找可能包含文本li
的任何'Model'
子元素。您需要的是如下查询:
//ul[@class='featureList' and ./li[contains(.,'Model')]]
此查询将为您提供class
featureList
个li
个元素,其中包含一个或多个包含'Model'
文字的{{1}}个孩子。
答案 1 :(得分:57)
我已经将我的+1给了Jeff Yates的解决方案。
以下是您的方法不起作用的快速解释。这样:
//ul[@class='featureList' and contains(li, 'Model')]
遇到contains()
函数的限制(或者XPath中的任何其他字符串函数)。
第一个参数应该是一个字符串。如果你给它一个节点列表(给它“li
”这样做),就必须转换为字符串。但是,此转换仅针对列表中的第一个节点完成。
在您的情况下,列表中的第一个节点是<li><b>Type:</b> Clip Fan</li>
(转换为字符串:“Type: Clip Fan
”),这意味着:
//ul[@class='featureList' and contains(li, 'Type')]
实际上会选择一个节点!
答案 2 :(得分:6)
这是一个关于 常见误解 的旧问题的新答案,关于XPath中的contains()
...
摘要:contains()
表示包含子字符串,不 包含节点。
这个XPath经常被误解:
//ul[contains(li, 'Model')]
错误的解释:
选择包含 ul
元素的li
元素,其中包含Model
。
这是错误的,因为
contains(x,y)
期望x
为字符串,将多个元素转换为字符串的XPath规则是this:
通过返回string-value的节点集将节点集转换为字符串 节点集中的节点document order中的第一个节点。如果 node-set为空,返回空字符串。
正确解释:选择 第一个 ul
孩子拥有string-value的li
个元素 包含 一个Model
子字符串。
<强> 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')]
选择one
ul
元素。
注意:未选择two
ul
元素,因为第一个li
子元素的字符串值
two
ul
的{{1}}是Foo
子字符串。
Model
选择//ul[li[contains(.,'Model')]]
和one
two
元素。
注意:选择了两个ul
元素,因为ul
分别应用于每个contains()
。 (因此,避免了棘手的多元素到字符串转换规则。)两个li
元素都有一个ul
子元素,其字符串值包含li
子字符串 - Model
元素不再重要。
答案 3 :(得分:0)
//ul[@class="featureList" and li//text()[contains(., "Model")]]
答案 4 :(得分:-5)
在此粘贴我的contains
示例:
//table[contains(@class, "EC_result")]/tbody