2011-07-14 9 views
3

<text />ノード内のタブのすべてのセルを含むデータを解析しようとしています。私は星の文字*とそれの後の4つのノードで始まるノードを無視する必要があります。 xpathでこれを行うことはできますか?これについて別の方法で行う必要がありますか?一致後のノードを除外するXpath

EDITは:私のXMLは次のようになります。

<page> 
    <text attr="123" attr2="1234">ROW 1 CELL 1</text> 
    <text attr="123" attr2="1234">ROW 1 CELL 2</text> 
    <text attr="123" attr2="1234">ROW 1 CELL 3</text> 
    <text attr="123" attr2="1234">ROW 1 CELL 4</text> 
    <text attr="123" attr2="1234">ROW 1 CELL 5</text> 
    <text attr="123" attr2="1234">* ROW 2 CELL 1</text> 
    <text attr="123" attr2="1234">ROW 2 CELL 2</text> 
    <text attr="123" attr2="1234">ROW 2 CELL 3</text> 
    <text attr="123" attr2="1234">ROW 2 CELL 4</text> 
    <text attr="123" attr2="1234">ROW 2 CELL 5</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 1</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 2</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 3</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 4</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 5</text> 
</page> 
+1

より良い...あなたは不明だ方法で、「ノード」を使用している例を示している - 多分「要素」と「要素のテキストを"? –

答えて

4

次の式:

/*/text[not(starts-with(., '*')) and 
     not(preceding::*[position()<5][starts-with(., '*')])] 

は、あなたの入力に対して、次を選択:

<root> 
    <text attr="123" attr2="1234">ROW 1 CELL 1</text> 
    <text attr="123" attr2="1234">ROW 1 CELL 2</text> 
    <text attr="123" attr2="1234">ROW 1 CELL 3</text> 
    <text attr="123" attr2="1234">ROW 1 CELL 4</text> 
    <text attr="123" attr2="1234">ROW 1 CELL 5</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 1</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 2</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 3</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 4</text> 
    <text attr="123" attr2="1234">ROW 3 CELL 5</text> 
</root> 

ROW 2のすべてがスキップされます。

次の式では、(ド・モルガンの法則による)と同等です:

/*/text[not(starts-with(., '*') or 
      preceding::*[position()<5][starts-with(., '*')])] 
+0

良い解決策 - 私の観測に感謝します:) – cordsen

1

これは、これが返されて、入力のためにあなた

//text[starts-with(.,"*")]/preceding-sibling::text 
| //text[starts-with(.,"*")]/following-sibling::text[position() > 4] 

のために動作します希望のノード

<text attr="123" attr2="1234">ROW 1 CELL 1</text> 
<text attr="123" attr2="1234">ROW 1 CELL 2</text> 
<text attr="123" attr2="1234">ROW 1 CELL 3</text> 
<text attr="123" attr2="1234">ROW 1 CELL 4</text> 
<text attr="123" attr2="1234">ROW 1 CELL 5</text> 
<text attr="123" attr2="1234">ROW 3 CELL 1</text> 
<text attr="123" attr2="1234">ROW 3 CELL 2</text> 
<text attr="123" attr2="1234">ROW 3 CELL 3</text> 
<text attr="123" attr2="1234">ROW 3 CELL 4</text> 
<text attr="123" attr2="1234">ROW 3 CELL 5</text> 

しかし、@ lwburkがコメントで指摘しているように、 *で始まる複数のノードがある場合、一般的なケースで動作します。これは、2つのステートメントとペアになった|演算子が、両方の一致するノードの前後のすべてを選択するためです。彼のソリューションは両方の状況を正しく処理します。

+0

カップルの観察:1)オフ・バイ・ワンのエラーがあります。 2)これは(ほぼ)提供された入力で動作しますが、より大きい例では機能しません(例えば、 '*'で始まる 'ROW 4 'を追加しようとするなど)。 –

+0

off-by-oneエラーが修正されました – cordsen

関連する問題