| Version 20 (modified by amachang, 4 years ago) |
|---|
XPath から CSS Selector への変換を真剣に検討するページ
XPath を IE8 で querySelector 出来るセレクタに変換する方法を考えよう」
HTML で使用することに特化していい
XPath から要素を取得する過程で使う目的
ブレスト
出来る系
//aaa//bbb//ccc
=> aaa bbb ccc
/aaa/bbb/ccc
=> html > bbb > ccc (ルートは html と決まっているから妥協)
id("hoge")
=> #hoge
id("hoge") | //aaa[@hoge="fuga"]
=> #hoge, aaa[hoge="fuga"]
//aaa/*[1]
=> aaa > *:first-child
//aaa[contains(@hoge, 'fuga')]
=> aaa[hoge*="fuga"]
//aaa[ends-with(@hoge, 'fuga')]
=> aaa[hoge$="fuga"]
(//aaa | //bbb)/ccc
=> aaa > ccc, bbb > ccc
//aaa[@hoge=1+1]
=> aaa[hoge="2"] (パース時に定数を計算しているので)
出来ない系
aaa/bbb/ccc => child 軸から始まる (一時的に id を付けてやるのはどうか、パフォーマンス気になる) ./aaa/bbb/ccc => self 軸 .. => parent 系の軸や兄要素にさかのぼる系 //aaa[.="hoge"] => 条件部に属性以外の条件 //aaa[@hoge=count(.//bbb//ccc)] => ネストしている (パース時に .//bbb//ccc をセレクタに直して実行し、 .//bbb//ccc の値が確定したら全体をセレクタに直して実行するのはどうか)
IE8 で対応するセレクタ
http://msdn.microsoft.com/en-us/library/cc351024%28VS.85%29.aspx
- Simple Selector
- .value
- #value
- E
- *
- [att=val]
- [att]
- [att|=val]
- [att~=val]
- [att^=val]
- [att*=val]
- [att$=val]
- Combinator
- E + F
- E > F
- E F
- E ~ F
方法を考える
方法 1
- XPath をパースする
- 定数に出来るところはする
- 構文木を変換する
- 上から順に走査
- 変換出来る部分木を探す
- トップに descendant 軸がくる部分木
- ルートから始まる部分木
- id 関数を実行する部分木
- id 関数に値がパース時に決まっている場合
- 実行する
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)