1

XPathを使用して子としてアンカー(およびオプションの空白)のみを持つ段落を見つけることは可能ですか? 「//p[a and not(*[not(self::a)] or text())]」まで取得できます。これは、段落タグとアンカー タグの間に空白がない場合にうまく機能します。

いくつかの具体的な例を示すために、これらに一致するクエリが必要です(現在、最初のもののみに一致します):

    <p><a>リンク</a></p>
    <p> <a>先頭にスペースがあるリンク</a></p>
    <p><a>末尾スペース付きのリンク</a> </p>
    <p> <a>先頭と末尾のスペースでリンク</a> </p>
    
しかし、これはこれらと一致しません:
    <p>イントロ テキスト <a>リンク</a> アウトロ テキスト。</p>
    <p><a>リンク</a>のエンディング テキスト。</p>
    <p>紹介テキスト <a>リンク</a></p>
    

4

3 に答える 3

1

私はこのように解決しました:

<p>要素を含み、<a>正規化されたテキストが<a>子要素の正規化されたテキストと等しいすべての要素を探しています。

//p[a and normalize-space(.) = normalize-space(a)]

あなたの例では、次の結果が返されます ( Demo ):

0: <p><a>link</a></p>
1: <p> <a>link with leading spaces</a></p>
2: <p><a>link with trailing spaces</a> </p>
3: <p> <a>link with leading and trailing spaces</a> </p>

normalize-space特定のサンプル データを使用すると、2 番目の関数を省くことさえ可能です。

//p[a and normalize-space(.) = a]

ただし、探しているものには脆弱すぎる可能性があります。これは Xpath 1.0 互換です。

于 2013-03-13T07:39:08.483 に答える
1

近い。使用normalize-space:

//p[a and not(*[not(self::a)] or normalize-space(string-join(text(),"")))]

string-joinnormalize-space は、単一の文字列のみを入力として受け入れるという事実を回避するために使用されます。

于 2013-03-12T19:50:58.703 に答える
0

以下は@wstのソリューションよりも少し優れており、XPath1.0でも機能します。

//p[a and not(*[not(self::a)] or text()[normalize-space()])]
于 2013-03-12T20:37:57.377 に答える