2013-03-22 64 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