2016-11-29 9 views
0

CSSセレクタが正しい情報を返しますが、XPathは返されないのはなぜですか? case_insensitive_equalsを想定し.cssはなぜこのNokogiriオブジェクトで動作しますが、XPathでは動作しませんか?

source = "<hgroup class='page-header channel post-head' data-channel='tech' data-section='sec0=tech&amp;sec1=index&amp;sec2='><h2>Tech</h2></hgroup>" 

doc = Nokogiri::HTML(source) 
doc.xpath('//hgroup[case_insensitive_equals(@class,"post-head")]//h2', XpathFunctions.new) 
=> [] 

doc.css("hgroup.post-head")[0].css("h2") 
=> [#<Nokogiri::XML::Element:0x6c2b824 name="h2" children=[#<Nokogiri::XML::Text:0x6c2b554 "Tech">]>] 

答えて

1

class属性がpost-head(ケース小文字を区別せずにか)に等しくないので、それはですが、それはそれを含まないものをその名前が、ありません。 XPathはclassの属性をプレーンな文字列として扱いますが、CSSはそれを分割せずにクラスを個別に処理しません。働くだろう

簡単なXPathは次のようになります。

doc.xpath('//hgroup[contains(@class, "post-head")]//h2') 

(私はカスタム機能を削除した、あなたは鈍感にこのケースを行うには、独自に作成する必要があります。)

このISN」しかし、全く同じですが、not-post-headなどのクラスにも一致します。より完全なXPathはsomething like thisとなります。

doc.xpath('//hgroup[contains(concat(" ", normalize-space(@class), " "), " post-head ")]//h2') 
関連する問題