2013-03-22 49 views
2

我想查找不需要的嵌套divs並通過查找只有一個元素(忽略空白節點)的div來清理它們。XPath選擇div與單個孩子忽略空白?

<div> 
    <div>Text in nested div</div> 
</div> 

到目前爲止,我有以下xpath似乎部分工作。

//div[count(node()[normalize-space()]) = 1] 
+0

以何種方式它部分不工作? – JLRishe 2013-03-22 16:46:56

回答

1

使用此短,高效表達

//div[*[1][self::div]][not(*[2]|text()[normalize-space()])] 
+0

那是什麼意思?如果第一個元素是div,第二個元素不存在或者是空元素? – Xeoncross 2013-03-22 18:51:16

+1

@Xeoncross,這表示第一個子元素必須是'div',並且不應該有第二個子元素,並且不應該有任何非空白的文本節點子元素。效率是子元素沒有被「計數,只有和1比較」。想象一下,有許多具有數百個子元素的'div' ... – 2013-03-22 18:55:20

+0

'not(* [2] | text()[normalize-space()])意味着沒有第二個元素或第二個元素是空的空白被刪除)。 – Xeoncross 2014-01-06 02:07:33

1

請這給一試:

//div[not(*[2]) and div and not(text()[normalize-space()])] 

這應該選擇div S作一個子元素,並沒有非空格子文本節點。

+0

似乎只用一個小小的改變就可以很好地工作,只選擇子div。 '// div [count(*)= 1 and child :: div and not(text()[normalize-space()])]' – Xeoncross 2013-03-22 17:07:16

+1

非常好。有一點需要注意的是,在這種情況下,在'div'之前不需要'child ::'。只使用'// div [count(*)= 1和div而不是(text()[normalize-space()])]將會完全相同,因爲子軸是默認軸。 – JLRishe 2013-03-22 17:29:06