好吧,我有下一个xml输入:
<root>
<node1>
<sub1/>
<sub2/>
<sub3>sub3</sub3>
</node1>
<node2/>
<node3>
<sub4>
<subsub>text</subsub>
</sub4>
</node3>
</root>
如何计算根元素(sub3,text)的非空文本后代?
当我使用count(/root/descendant::*[normalize-space()])
时,它计数为5,但我希望为2。
我试图计算元素的非空文本后代:
count(/root/node3/descendant::*[text()])
然后返回2,但我希望是1。
我哪里错了?
答案 0 :(得分: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>
。这是两个节点。