2

私はいくつかの危険な HTML を扱っています。特定の要素の祖先の様式化された例を次に示します。

/html/body/foo/bar/baz/quux/b

bodyコード内にへの参照があり、これがbXPath クエリのコンテキスト要素です。上記の例では、どのように見つけるのfooですか? より説明的に言えば、特定の要素の子である特定の祖先の最初の要素を見つけるにはどうすればよいですか? bodyとの間の要素bは不明であり、実行時にタイプと深さが異なります。b到達するまで祖先を反復処理することで、XPath の外部でこれを行うことができますが、bodyこの相対参照を見つけるための XPath 祖先マジックがあるかどうか疑問に思っています。

4

2 に答える 2

2

使用:

ancestor::body[1]/foo

これにより、コンテキスト ノードbodyの最初の祖先である最初の要素の子である要素が選択されます。body

ネストされた要素がないことがわかっている場合でもbody、上記は以下よりもわずかに効率的です

ancestor::body/foo

この最後の式を評価すると、すべての祖先が であるかどうかがテストされるためbodyです。

更新

コメントで、OPは次のことを明確にしました:

さて、私は 2 つのセット (コンテキスト ノードの祖先、ボディの子) の共通部分を見つけようとしています。

XPath 1.0 では、これは、ノード セットの共通部分のよく知られた Kayessian 式への q 直接代入です

$ns1[count(.|$ns2) = count($ns2)]

この場合、 $ns2$ns1ancestor::*/*/body/*に置き換えます。

ancestor::*[count(. | /*/body/*) = count(/*/body/*)]

XPath 2.0 では、intersectoperatorを使用すると、これがより簡単になります。

ancestor::* intersect /*/body/*
于 2012-07-01T22:23:37.910 に答える
2

テストしなくても、それでうまくいくと思いancestor::body/*[1]ます。

説明:ancestor::bodyは「軸」にbody沿った最初の要素であり、その要素のすべての子を選択し、その子のリストの最初の要素 (この場合は ) を選択します。ancestor/*[1]foo

于 2012-07-01T21:49:47.700 に答える