Xpath获取没有完整空子节点的节点

时间:2014-05-05 08:28:52

标签: xpath

场景(缩小):

<a>
  <Sections>
    <Section>
      <Title></Title>
      <Subject></Subject>
      <Body></Body>
    </Section>
    <Section>
      <Title/>
      <Subject/>
      <Body/>
    </Section>
    <Section>
      <Title>Hello</Title>
      <Subject></Subject>
      <Body></Body>
    </Section>
    <Section>
      <Title></Title>
      <Subject>I have a problem</Subject>
      <Body></Body>
    </Section>
  </Sections>
</a>

问题:

我应该使用什么XPath来返回至少有一个子节点不为空的<Section/>个节点列表,以便返回:

    <Section>
      <Title>Hello</Title>
      <Subject></Subject>
      <Body></Body>
    </Section>
    <Section>
      <Title></Title>
      <Subject>I have a problem</Subject>
      <Body></Body>
    </Section>

换句话说,应该过滤掉具有完全空子节点的<Section>个节点。

3 个答案:

答案 0 :(得分:2)

尝试:

.//Section[./*/node()]

即。查找具有子节点(文本节点或元素节点)的Section元素。根据您对空子节点的要求,这可能会也可能不会起作用,因此可能需要改进。

答案 1 :(得分:0)

如果您使用的是XPath 2.0,则可以使用:

/a/Sections/Section[(true() = (for $i in * return has-children($i)))]

如果有子元素,则检查每个子元素,然后检查这对于至少一个孩子是否属实。

我不确定是否可以使用XPath 1.0实现这一点。如果只有文本节点作为子元素,则以下工作:

/a/Sections/Section[not(. = "")]

但是,如果存在空元素,则不会返回该元素,例如<Title><test/></Title>

答案 2 :(得分:0)

试试这个xpath:

//a/Sections/Section[count(*[.!='']) > 0]