Xpath:仅当一个子节点包含特殊字符串时才匹配节点

时间:2014-02-12 22:33:07

标签: xpath

第一个样本:

<ul class="breadcrumbs">
  <li><a href="http://www.sample.com/1">Home</a></li>
  <li><a href="http://www.sample.com/2">Movies</a></li>              
  <li><a href="http://www.sample.com/3">Thrilling Action</a></li>          
  <li><strong>Armageddon</strong></li>
</ul>

第二个样本:

<ul class="breadcrumbs">
  <li><a href="http://www.sample.com/1">Home</a></li>
  <li><a href="http://www.sample.com/2">Food</a></li>              
  <li><a href="http://www.sample.com/3">Sweet rice</a></li>          
  <li><strong>Uncle Ben's Boil-In-Bag Rice</strong></li>
</ul>

这是我走了多远:

/html/body//ul[@class='breadcrumbs']/li[2]/a[contains(., 'Movies') or contains(., 'Cool Gadgets')]

摘录Movies - 但我也希望它提取Thrilling Action

解释:如果第二个<a>标记的<li> - 标记包含字符串“Movies”或“Cool Gadgets”,我想提取第二个<a> - 标记第三个<li> - 标记。

/html//ul[@class='breadcrumbs']/li[2]/a
/html//ul[@class='breadcrumbs']/li[3]/a

如果li [2]不包含“Movies”或“Cool Gadgets”,我不想提取任何内容!

2 个答案:

答案 0 :(得分:2)

如果我做对了,您希望匹配<li> 中的所有<ul>标记,如果其中一个<li>包含特殊字符串。你可以使用:

  

// ul [@ class =“breadcrumbs”和(li [2] / a / text()=“Movies”或li [2] / a / text()=“Cool Gadgets”)] / li [ position()&gt; 1] /一个/文本()

<强>解释

1)第一部分//ul[@class="breadcrumbs" and (li[2]/a/text() = "Movies" or li[2]/a/text() = "Cool Gadgets")]会检查您是否符合您需要的<ul>标记。

@class="breadcrumbs"执行您可能期望的操作,如果您的过滤字符串存在,li[2]/a/text() = "Movies" or li[2]/a/text() = "Cool Gadgets"将返回true。

当然,如果需要,您可以将a/text() = "Movies"更改为a[contains(text(), "Movies")]

2)一旦我们知道我们在正确的位置,我们所要做的就是选择你想要的字段。这是由li[position() > 1]完成的,它将捕获除第一个之外的每个<li>。选择文字,你很高兴!

答案 1 :(得分:-2)

与本文档相关的文档类型声明(请参阅DocumentType)。

  • 对于没有文档类型声明的XML文档,返回null。
  • 对于HTML文档,可以返回DocumentType对象,而与HTML文档中是否存在文档类型声明无关。

这提供了对此文档的子节点DocumentType节点的直接访问。此节点可以在文档创建时设置,然后通过使用子节点操作方法(例如Node.insertBeforeNode.replaceChild)进行更改。

但是,请注意,虽然某些实现可能会实例化不同类型的Document对象,这些对象支持除&#34; Core&#34;之外的其他功能,例如&#34; HTML&#34; [DOM Level 2 HTML],基于创建时指定的DocumentType,之后更改它不太可能导致支持的功能发生变化。 coolgadgets