36

私は次のxmlを持っています:

<doc>
    <divider />
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <divider />
    <p>text</p>
    <p>text</p>
    <divider />
    <p>text</p>
    <divider />
</doc>

最初の分周器要素の後、次の分周器要素が出現するまで、すべてのpノードを選択したいと思います。次のxpathで試しました:

//divider[1]/following-sibling::p[following::divider]

しかし問題は、最後の分周器要素の前にすべてのp要素を選択することです。xpath1を使用してそれを行う方法がわかりません。

4

4 に答える 4

36

バイトバスターと同じ概念ですが、xpathが異なります。

/*/p[count(preceding-sibling::divider)=1]
于 2012-06-02T04:50:36.950 に答える
21

一般的なXPath式は次のとおりです。

/*/divider[$k]
    /following-sibling::p
       [count(.|/*/divider[$k+1]/preceding-sibling::p)
       =
        count(/*/divider[$k+1]/preceding-sibling::p)
       ]

で置き換える$kと、必要なノードが1正確に選択されます。p

で置き換える$kと、2番目と3番目の間の2すべてのp要素divider、...などになります。

説明

これは、ノードセットの共通部分に対するKayessianXPath1.0式の単純なアプリケーションです。

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

ノードセットとの両方に属するすべてのノードを選択します。$ns1$ns2

この特定のケースでは、次のように置き換え$ns1ます。

/*/divider[$k]/following-sibling::p

そして、次のように置き換え$ns2ます。

/*/divider[$k+1]/preceding-sibling::p
于 2012-06-02T05:04:09.993 に答える
8

はるかに単純でおそらくより高速な解決策があると思います。少なくとも1つの先行する兄弟ディバイダーを持つ2番目のディバイダーの先行するすべての兄弟が必要です。

/doc/divider[2]/preceding-sibling::p[preceding-sibling::divider]

もちろん、2番目と3番目の仕切りの間のパラグラフを見つけたい場合は、もう少し複雑になります。ダニエル・ヘイリーのソリューションのようなものが必要になります。

于 2012-06-02T17:40:43.707 に答える
5

p正確に1つの要素dividerを持つすべてを選択するのはどうpreceding-siblingですか?

//doc/p[preceding-sibling::divider[1] and not (preceding-sibling::divider[2])]
于 2012-06-02T04:21:40.397 に答える