次のようなマークアップを指定します。
<p>
<code>foo</code><code>bar</code>
<code>jim</code> and then <code>jam</code>
</p>
最初の3つを選択する必要がありますが<code>
、最後は選択しません。ロジックは、「空白以外のコンテンツを含むテキストノードが1つ以上存在しない限りcode
、前後の兄弟要素がであるすべての要素を選択します。code
Nokogiri(libxml2を使用)を使用している場合、XPath1.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>
の連続したすべての実行を一度に選択したい。のセットの1つの中央にスペース文字があることは間違いではありませんY
。