2011-08-09 6 views
3

私はXPathsの経験はあまりありませんが、私はしばらく試してみて、解決策を考えずにたくさん検索しました。2つのケースを処理するXPath 1.0のクエリ

私は主にどのような私が主に興味は私の文書のほとんどに存在するプリアンブルのdiv、に含まれるテキストである

<html> 
    <head></head> 
    <body> 
     <div class="preamble"> 
      <p>Some text 1</p> 
     </div> 
     <h1>Some headline</h1> 
     <p>Some other text</p> 
    </body> 
</html> 

のようなものですXHTMLから情報を抽出しています。問題は、divがないものです。これらの場合、bodyタグの下に他のテキストを抽出したいと思います。

この場合、「Some text 1」を取得したいと思いますが、divがない場合は、「Some headline Some other text」などと確認できます。

XPath 2.0では問題はありませんが、状況によっては「コア」1.0セットの機能に制限されます。

私の質問は、この動作が1つのXPath 1.0クエリで可能かどうか、またはそれをあきらめるべきかどうかです。

よろしく/マグナス

答えて

1

このXPathを試してみてください:

//div[@class = 'preamble'] 
    | //body/*[not(preceding-sibling::div[@class = 'preamble']) 
     and not(self::div[@class = 'preamble'])] 
1

のXPath 1.0はnodesetsのための順序を指定していないので、あなたはあなたの2例は排他的であることを保証します。

string(/html/body/div[@class='preamble'] | /html/body[not(div[@class='preamble'])]) 

あなたのXPathプロセッサは、ドキュメント順にnodesetsを返した場合、単純なクエリが実行します:

string((/html/body/div[@class='preamble'] | /html/body)[last()]) 
+1

トップは素晴らしいと思われます。ありがとう:) –

+1

@マグヌスNilsson:私はこの答えが最高であることに同意します。だから、あなたはそれを受け入れる必要があります - ここで、これは感謝の気持ちを表す確立された方法です。これは、最善の答えの横にあるチェックマークをクリックすることによって行われます。 –

0

私はあなたがこのXPath 1.0のをニートだと思う:

"/html/body/div[@class='preamble']//text() 
| 
/html/body[not(div/@class='preamble')]//text()" 

最初のロケーションパスを選択div内のすべてのテキストノード。もう一方は、そのdivなしで本文内のすべてのテキストノードを選択します。両方の組合(|)が希望のテキストを選択します。

+1

ありがとう!うまく動作するようです。 –

関連する問題