如何在这里使用XPath contains()?

时间:2009-06-30 17:34:03

标签: xml 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>
...

5 个答案:

答案 0 :(得分:185)

您只查看查询中的第一个li子项,而不是查找可能包含文本li的任何'Model'子元素。您需要的是如下查询:

//ul[@class='featureList' and ./li[contains(.,'Model')]]

此查询将为您提供class featureListli个元素,其中包含一个或多个包含'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

这是错误的,因为

  1. contains(x,y)期望x为字符串,
  2. 将多个元素转换为字符串的XPath规则是this

      

    通过返回string-value的节点集将节点集转换为字符串   节点集中的节点document order中的第一个节点。如果   node-set为空,返回空字符串。

  3. 正确解释:选择 第一个 ul孩子拥有string-valueli个元素 包含 一个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