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>。那是两个节点。