2015-05-27 54 views
1

好了,我的下一個XML輸入:Xpath的計數非空後裔

<root> 
    <node1> 
    <sub1/> 
    <sub2/> 
    <sub3>sub3</sub3> 
    </node1> 
    <node2/> 
    <node3> 
    <sub4> 
     <subsub>text</subsub> 
    </sub4> 
    </node3> 
</root> 

我怎麼能算根元素的非空文本的後裔(SUB3,文字)? 當我使用count(/root/descendant::*[normalize-space()])它計算5,但我希望是2 我試圖計算非空文本子孫這樣的元素:

count(/root/node3/descendant::*[text()]) 

,並返回2,但我希望是1 。

我哪裏錯了?

回答

0

我想你想

count(//*[not(*) and normalize-space()]) 

即那些本身沒有子元素,但確實有一些文字。


如果你想數實際,物理文本節點,這將是

count(//*[not(*)]/text()) 

隨着你的輸入導致兩個文本節點選擇的,但是它也將算爲空(空白 - 只)文本節點,如果他們在那裏。


你的錯誤是/root/descendant::*[normalize-space()]選擇

  • <node1>爲非空的,因爲它(間接地)包含字符串'sub3'
  • 然後選擇<sub3>,顯然
  • 然後選擇<node3><sub4>最後<subsub>,出於同樣的原因

總體而言,這是五個節點。

/root/node3/descendant::*[text()]選擇<sub4>,因爲當然有文本子節點(儘管只有空格)和<subsub>。這是兩個節點。