1

好吧,我有下一个 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。

我哪里错了?

4

1 回答 1

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>,当然还有 。那是两个节点。

于 2015-05-27T15:02:13.220 回答