2011-07-14 101 views
3

我試圖分析<text />節點中的標籤的每個單元格的一些數據。我需要忽略以星號*以及之後的4個節點開頭的節點。這可以用xpath來完成,還是需要以不同的方式來解決這個問題?匹配後排除節點的Xpath

編輯:我的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在評論中指出,它並沒有如果您有多個以*開頭的節點,則適用於一般情況。這是因爲與兩個語句配對的|運算符最終選擇了兩個匹配節點之前和之後的所有內容。他的解決方案能夠正確處理兩種情況

+0

夫婦觀察:1)你有一個錯誤的錯誤; 2)這個(幾乎)對所提供的輸入起作用,但對於較大的例子不起作用(例如嘗試添加一個以'*'開頭的'ROW 4')。 –

+0

已修復off-by-one錯誤 – cordsen

相關問題