Xpath计数非空后代

时间:2015-05-27 14:42:52

标签: xml xpath xpath-1.0

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

我哪里错了?

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