给定标记,如:
<p>
<code>foo</code><code>bar</code>
<code>jim</code> and then <code>jam</code>
</p>
我需要选择前三个<code>
——但不是最后一个。逻辑是“选择所有code
具有前置或后置同级元素的元素,该元素也是code
,除非存在一个或多个文本节点,它们之间具有非空白内容。
鉴于我使用的是 Nokogiri(它使用 libxml2),我只能使用 XPath 1.0 表达式。
尽管需要一个复杂的 XPath 表达式,但在 Nokogiri 文档上执行相同操作的 Ruby 代码/迭代也是可以接受的。
请注意,CSS相邻兄弟选择器会忽略非元素节点,因此选择nokodoc.css('code + code')
会错误地选择最后一个<code>
块。
Nokogiri.XML('<r><a/><b/> and <c/></r>').css('* + *').map(&:name)
#=> ["b", "c"]
编辑:更多测试用例,为清楚起见:
<section><ul>
<li>Go to <code>N</code> and
then <code>Y</code><code>Y</code><code>Y</code>.
</li>
<li>If you see <code>N</code> or <code>N</code> then…</li>
</ul>
<p>Elsewhere there might be: <code>N</code></p>
<p><code>N</code> across parents.</p>
<p>Then: <code>Y</code> <code>Y</code><code>Y</code> and <code>N</code>.</p>
<p><code>N</code><br/><code>N</code> elements interrupt, too.</p>
</section>
以上Y
都应该选择。不N
应该选择任何一个。的内容<code>
仅用于指示应该选择哪个:您可能不会使用内容来确定是否选择一个元素。
出现的上下文元素<code>
是不相关的。它们可能出现在 中<li>
,它们可能出现在 中<p>
,它们可能出现在其他东西中。
我想<code>
一次选择所有连续的运行。在一组 . 的中间有一个空格字符并不是一个错误Y
。