Xpath 计数非空后代
Xpath count non-empty descendants
嗯,我有下一个xml输入:
<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()])
它 returns 2,但我希望是 1。
我哪里错了?
我想你想要
count(//*[not(*) and normalize-space()])
即那些本身没有子元素但有一些文本的元素。
如果你想计算实际,物理文本节点,那就是
count(//*[not(*)]/text())
您的输入导致两个文本节点被选中,但如果它们存在,它也会计算空(仅空白)文本节点。
你的错误是 /root/descendant::*[normalize-space()]
选择了
<node1>
为非空,因为它(间接)包含字符串 'sub3'
。
- 然后它选择
<sub3>
,显然
- 然后选择
<node3>
、<sub4>
,最后选择 <subsub>
,原因相同
总共有五个节点。
/root/node3/descendant::*[text()]
选择 <sub4>
,因为当然有文本子项(尽管只有空格)和 <subsub>
。那是两个节点。
嗯,我有下一个xml输入:
<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()])
它 returns 2,但我希望是 1。
我哪里错了?
我想你想要
count(//*[not(*) and normalize-space()])
即那些本身没有子元素但有一些文本的元素。
如果你想计算实际,物理文本节点,那就是
count(//*[not(*)]/text())
您的输入导致两个文本节点被选中,但如果它们存在,它也会计算空(仅空白)文本节点。
你的错误是 /root/descendant::*[normalize-space()]
选择了
<node1>
为非空,因为它(间接)包含字符串'sub3'
。- 然后它选择
<sub3>
,显然 - 然后选择
<node3>
、<sub4>
,最后选择<subsub>
,原因相同
总共有五个节点。
/root/node3/descendant::*[text()]
选择 <sub4>
,因为当然有文本子项(尽管只有空格)和 <subsub>
。那是两个节点。